深入理解多态
多态的概念和作用(深入理解)

多态的概念和作⽤(深⼊理解)多态是⾯向对象的重要特性,简单点说:“⼀个接⼝,多种实现”,就是同⼀种事物表现出的多种形态。
编程其实就是⼀个将具体世界进⾏抽象化的过程,多态就是抽象化的⼀种体现,把⼀系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进⾏对话。
对不同类的对象发出相同的消息将会有不同的⾏为。
⽐如,你的⽼板让所有员⼯在九点钟开始⼯作, 他只要在九点钟的时候说:“开始⼯作”即可,⽽不需要对销售⼈员说:“开始销售⼯作”,对技术⼈员说:“开始技术⼯作”, 因为“员⼯”是⼀个抽象的事物, 只要是员⼯就可以开始⼯作,他知道这⼀点就⾏了。
⾄于每个员⼯,当然会各司其职,做各⾃的⼯作。
多态允许将⼦类的对象当作⽗类的对象使⽤,某⽗类型的引⽤指向其⼦类型的对象,调⽤的⽅法是该⼦类型的⽅法。
这⾥引⽤和调⽤⽅法的代码编译前就已经决定了,⽽引⽤所指向的对象可以在运⾏期间动态绑定。
再举个⽐较形象的例⼦:⽐如有⼀个函数是叫某个⼈来吃饭,函数要求传递的参数是⼈的对象,可是来了⼀个美国⼈,你看到的可能是⽤⼑和叉⼦在吃饭,⽽来了⼀个中国⼈你看到的可能是⽤筷⼦在吃饭,这就体现出了同样是⼀个⽅法,可以却产⽣了不同的形态,这就是多态!多态的作⽤:1. 应⽤程序不必为每⼀个派⽣类编写功能调⽤,只需要对抽象基类进⾏处理即可。
⼤⼤提⾼程序的可复⽤性。
//继承2. 派⽣类的功能可以被基类的⽅法或引⽤变量所调⽤,这叫向后兼容,可以提⾼可扩充性和可维护性。
//多态的真正作⽤,以前需要⽤switch实现----------------------------------------------------多态是⾯向对象程序设计和⾯向过程程序设计的主要区别之⼀,何谓多态?记得在CSDN⾥⼀篇论C++多态的⽂章⾥有⼀名话:“龙⽣九⼦,⼦⼦不同”多态就是同⼀个处理⼿段可以⽤来处理多种不同的情况,在钱能⽼师的《C++程序设计教程》书中有这样⼀个例⼦:定义了⼀个⼩学⽣类[本⽂全部代码均⽤伪码]class Student{public:Student(){}~Student(){}void 交学费(){}//......};⾥⾯有⼀个 “交学费”的处理函数,因为⼤学⽣和⼩学⽣⼀些情况类似,我们从⼩学⽣类中派⽣出⼤学⽣类:class AcadStudent:public Student{public:AcadStudent(){}~ AcadStudent(){}void 交学费(){}//.......};我们知道,中学⽣交费和⼤学⽣交费情况是不同的,所以虽然我们在⼤学⽣中继承了中学⽣的"交学费"操作,但我们不⽤,把它重载,定义⼤学⽣⾃⼰的交学费操作,这样当我们定义了⼀个⼩学⽣,⼀个⼤学⽣后:Student A;AcadStudent B;A.交学费(); 即调⽤⼩学⽣的,B.交学费();是调⽤⼤学⽣的,功能是实现了,但是你要意识到,可能情况不仅这两种,可能N种如:⼩学⽣、初中⽣、⾼中⽣、研究⽣.....它们都可以以Student[⼩学⽣类]为基类。
多态编程应用实验报告

#### 实验名称:多态编程应用#### 实验日期:2023年11月15日#### 实验环境:Java Development Kit (JDK) 1.8,Eclipse IDE#### 实验目的:1. 理解多态的概念及其在面向对象编程中的重要性。
2. 通过具体实例学习多态的应用,包括方法重写和向上转型。
3. 掌握多态在处理不同类型对象时的灵活性和效率。
#### 实验内容:一、实验背景多态是面向对象编程的三大基本特性之一,它允许不同类的对象对同一消息做出响应。
在Java中,多态主要通过方法重写和向上转型来实现。
本实验旨在通过设计一个简单的动物管理系统,来演示多态在实际编程中的应用。
二、实验设计1. 定义一个抽象类`Animal`,其中包含一个抽象方法`makeSound`。
2. 创建几个继承自`Animal`的具体类,如`Dog`、`Cat`和`Bird`,并分别实现`makeSound`方法。
3. 设计一个`AnimalManager`类,用于管理不同类型的动物对象。
4. 在`AnimalManager`类中,使用多态特性展示不同动物的叫声。
三、实验步骤1. 创建抽象类`Animal`:```javapublic abstract class Animal {public abstract void makeSound();}```2. 创建具体类`Dog`、`Cat`和`Bird`:```javapublic class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Woof! Woof!"); }}public class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("Meow! Meow!"); }}public class Bird extends Animal {@Overridepublic void makeSound() {System.out.println("Tweet! Tweet!"); }}```3. 创建`AnimalManager`类:```javapublic class AnimalManager {public void manageAnimals(Animal[] animals) {for (Animal animal : animals) {animal.makeSound();}}}```4. 编写主类`Main`,用于测试多态应用:```javapublic class Main {public static void main(String[] args) {Animal[] animals = new Animal[3];animals[0] = new Dog();animals[1] = new Cat();animals[2] = new Bird();AnimalManager manager = new AnimalManager(); manager.manageAnimals(animals);}}```四、实验结果与分析运行`Main`类,输出结果如下:```Woof! Woof!Meow! Meow!Tweet! Tweet!```实验结果显示,通过多态,`AnimalManager`类能够处理不同类型的动物对象,并调用它们各自特有的`makeSound`方法。
Java实验

实验一熟悉Java开发环境(验证性2学时)一、实验目的与要求:1 掌握Java Application程序的开发过程并编写第一个Java Application程序*2 掌握Java Applet程序的开发过程并编写第一个Java Applet程序。
*3 练习简单的HTML文件配合Java Applet使用。
4 熟悉jdk的使用二、实验内容:1 编写一个Java Application程序,在屏幕上显示”This is my first java program!”.*2 编写第一个Java Applet 程序,在屏幕上显示”This is my first Java Applet!”三、实验步骤:1、jdk的使用jdk开发工具包可以从网站下载,jdk不是集成编译环境,须手动运用命令行程序进行编译和解释执行1)编辑.java文件可以在记事本或其他纯文本编辑器中编辑,保存时把文件扩展名定为.java即可,当然要注意文件名命名的要求2)编译生成.class文件进入dos系统进行编译(如图1.1所示),格式如javac MyFirstApplication.java,要注意图1.1进入命令行看javac.exe的路径并且MyFirstApplication.java文件路径和javac.exe路径一样。
编译成功后就能在浏览器中看见多了一个MyFirsApplication.class或更多的.class文件。
如图1.2所示图1.2使用jdk编译MyFirstApplication.java文件3)解释执行Application程序:同样是在dos系统下解释执行,格式如java MyFirstApplication,注意.class后缀别加,如图1.3所示。
图1.3解释执行MyFirstApplication.class程序* applet程序进入dos系统进行编译,格式如javac MyFirstApplet.java,要注意看javac.exe的路径并且MyFirstApplet.java文件路径和javac.exe路径一样。
基因突变和多态性

基因突变和多态性基因突变和多态性是遗传学中的重要概念,它们在生物进化和个体间的变异中起着关键作用。
本文将探讨基因突变和多态性的定义及其在生物界的意义,以及它们对生物适应性和人类健康的影响。
一、基因突变的定义与分类基因突变是指DNA序列发生的一种突然而异常的变化,它是遗传信息的重要组成部分。
基因突变可以分为多种类型,包括点突变、插入突变、缺失突变和倒位突变等。
这些突变可能会影响基因的表达和功能,进而导致生物性状发生变化。
二、基因突变对生物进化的重要性基因突变是生物进化的基础,它为生物体的遗传多样性提供了源源不断的新变异。
基因突变可以使得个体具备适应环境的新特征,从而在竞争中获得优势并传递给后代。
这种累积的遗传变异是进化的主要驱动力之一。
三、多态性的定义与种类多态性是指在一个种群中存在多种形态或表型的现象。
基因多态性是多态性的一个重要表现形式,它指的是同一基因具有多种等位基因,并且不同等位基因可能对生物表型产生不同的影响。
多态性可以分为基因型多态性和表型多态性。
四、多态性对生物适应性的影响多态性可以增强群体的适应性和生存能力。
一方面,基因多态性使得生物个体对变化环境具备更多的适应选择余地,可以减轻环境压力对群体的冲击。
另一方面,多态性还可以促进生物的繁殖和繁殖成功率,提高遗传多样性。
五、基因突变和多态性在人类健康中的作用基因突变和多态性在人类健康中扮演重要角色。
一些基因突变可能导致人类遗传病的出现,如囊性纤维化、镰刀细胞性贫血等。
然而,基因多态性也可以带来一定的优势,如免疫系统的多态性有助于人类抵抗疾病。
了解基因突变和多态性对人类健康的影响,对疾病的预防和治疗具有重要意义。
六、探索基因突变和多态性的未来研究方向随着科学技术的进步,我们对基因突变和多态性的认识还在不断深化。
未来的研究方向包括基因突变的机制解析、多态性与环境交互作用的探索,以及利用基因突变和多态性的知识开展针对遗传病的治疗和预防等。
总结:基因突变和多态性对生物界的影响是不可忽视的。
简述面向对象中的多态

简述面向对象中的多态
面向对象中的多态是指一个对象可以以多种形态存在。
简单来说,多态就是同一个方法可以有不同的实现方式。
在面向对象的程序设计中,多态是一种非常重要的概念。
它能够提高代码的灵活性和可扩展性,使得代码更易于维护和扩展。
多态的实现方式主要有两种:静态多态和动态多态。
静态多态是通过函数的重载和运算符的重载来实现的。
函数的重载是指在同一个类中定义多个同名函数,但这些函数具有不同的参数列表。
运算符的重载是指对于某个运算符,可以定义多个不同的操作方式。
在编译时,编译器会根据调用时的参数类型来确定具体调用的函数或运算符。
动态多态是通过继承和虚函数来实现的。
继承是指子类可以继承父类的属性和方法,通过定义一个指向父类对象的指针或引用,可以调用子类对象中重写的方法。
虚函数是在父类中声明为虚函数的函数,子类可以对其进行重写。
在运行时,根据实际对象的类型来调用相应的方法。
多态具有很多优点。
首先,它可以提高代码的重用性,一个类的方法可以被多个类继承并重写,这样可以减少代码的重复编写。
其次,多态可以使代码更加灵活,可以根据需要动态地根据对象的类型来调用相应的方法。
再次,多态可以提高代
码的可扩展性,当需要添加新的功能时,只需要在子类中重写相应的方法即可,而不需要修改已有的代码。
总之,多态是面向对象编程中非常重要的概念,通过使用多态可以使代码更灵活、可扩展和易于维护。
它是面向对象编程中的重要特性之一,值得我们深入理解和应用。
人体基因组的多态性与遗传疾病

人体基因组的多态性与遗传疾病随着科技的不断发展,人类对基因组的理解也越来越深入。
基因组多态性是指同一物种或同一种族个体基因组序列上的差异,这一差异既可以产生后代优越的生理特征,也可能造成一些遗传疾病。
本文将针对人体基因组的多态性及其与遗传疾病的关系展开讨论。
一、人类基因多态性的来源人体细胞内含有23对染色体,其中最关键的一对是性染色体,即X、Y染色体。
基因是存在于染色体上,决定人类体内的遗传特征,其中同一基因可有多个等位基因。
等位基因是指同一基因所对应的基因根据其不同的表达方式,产生的由不同的序列构成的基因。
人类基因多态性来源主要包括三个方面:自然突变、基因重组及交换。
自然突变是指在DNA复制、DNA修复或细胞分裂时突然发生的变异,产生新的等位基因。
基因重组则是指发生在有性生殖中不同亲本基因物种间突然组合的变异,产生新的基因型。
另外,基因交换与基因重组类似,通常发生在兄弟姐妹及其他亲缘关系亲属间。
二、基因多态性与遗传疾病基因多态性和遗传疾病之间存在一定的相关性。
一般来说,基因多态性对于单基因遗传病的发病率没有太大影响。
但对于一些复杂性疾病,基因多态性是决定疾病形成的重要因素之一。
1.单基因遗传病单基因遗传病大多数情况下仅因单一基因的突变所引起,主要分为显性遗传和隐性遗传两种类型。
其中以囊性纤维化为例,这种病是由某一单基因的突变质变所引起的,危害程度相对较高。
相反,血红蛋白C病的影响程度相对较轻,虽然也是遗传型隐性但发病率较低。
2.复杂遗传病复杂遗传疾病是指由多个基因突变、外部环境及其他因素共同引起的疾病,如高血压、糖尿病等。
通常,这些疾病的发病率由基因环境因素所主导,并不受单一基因的调节。
三、某些基因的多态性与疾病的联系人类基因组多态性非常复杂,现代医学已经证明很多基因与疾病之间存在着一定的联系。
在这方面进行了深入的研究,以下是几个案例:1. ACE基因多态性与高血压ACE(血管紧张素转换酶)基因多态性和高血压之间存在一定的相关性。
多态的实现原理
多态的实现原理多态是面向对象编程中的一个重要概念,它允许不同类的对象对同一消息做出不同的响应。
在实际编程中,多态性使得我们可以编写出更加灵活、可扩展的代码。
那么,多态的实现原理是什么呢?首先,我们需要了解多态的两种实现方式,静态多态和动态多态。
静态多态是通过方法的重载和重写来实现的,而动态多态则是通过继承和接口实现的。
静态多态是指在编译期间确定调用的方法,主要是通过方法的重载和重写来实现。
方法的重载是指在同一个类中,方法名相同,但参数列表不同,编译器根据参数列表的不同来确定调用哪个方法。
方法的重写是指子类重新定义了父类中已有的方法,通过父类引用指向子类对象时,调用的是子类中的方法。
动态多态是指在运行时确定调用的方法,主要是通过继承和接口实现的。
通过继承,子类可以继承父类的方法,并且可以对其进行重写,从而实现多态。
通过接口,不同的类可以实现相同的接口,并且可以根据具体的实现类来确定调用的方法。
多态的实现原理主要是通过虚方法表(vtable)和虚函数指针(vptr)来实现的。
在面向对象编程中,每个类都有一个虚方法表,其中存储了该类的虚函数地址。
当一个类包含虚函数时,编译器会在该类的对象中插入一个指向虚方法表的指针,即虚函数指针。
当调用虚函数时,实际上是通过虚函数指针来查找虚方法表,从而确定调用的是哪个函数。
总结一下,多态的实现原理主要是通过静态多态和动态多态两种方式来实现的。
静态多态是通过方法的重载和重写来实现的,而动态多态是通过继承和接口实现的。
在底层,多态是通过虚方法表和虚函数指针来实现的,通过这两种机制来确定调用的方法。
多态使得我们可以编写出更加灵活、可扩展的代码,提高了代码的复用性和可维护性。
在实际编程中,我们应该充分利用多态的特性,编写出更加灵活、可扩展的代码。
同时,深入理解多态的实现原理,对于我们提高编程水平,设计更加优雅的系统架构也是非常有帮助的。
希望本文对大家对多态的实现原理有所帮助,谢谢阅读!。
多态性在遗传学中的作用
多态性在遗传学中的作用遗传学是研究个体遗传性状的科学领域,它试图理解遗传信息的传递和变异。
在遗传学研究中,多态性是一个重要的概念,它指的是个体在其遗传序列中存在多种不同基因型的表现形式。
多态性的存在为遗传学研究提供了宝贵的资源和机会,并在许多方面发挥着重要作用。
首先,多态性在遗传学研究中被广泛应用于基因的检测和诊断。
不同基因型的存在使得我们能够区分不同个体之间的遗传差异。
这种遗传差异能够用于确定个体是否携带某些致病基因,如突变基因或与遗传疾病相关的基因。
通过分析多态性与疾病的相关性,遗传学家可以利用这种多态性进行基因检测和诊断,有助于疾病预防和早期治疗。
其次,多态性对于研究人口遗传学和人类进化起到了重要作用。
人类种群中的遗传多样性是人类进化过程中的重要指标。
多态性使得我们能够研究人类种群之间的遗传差异、突变频率以及人类种群的起源和发展。
通过通过多态性的分析,遗传学家可以了解人类种群的祖先来源,探索不同种群之间的迁徙和交流历史,甚至重新构建人类族群的谱系树。
此外,多态性也对于农业遗传改良和种质资源保护起到了关键作用。
农作物和家畜的多态性可以用来评估其遗传差异的程度和丰富性。
这有助于农业科学家选择最佳品种进行杂交育种,以提高产量、耐旱性、抗病性等农作物和家畜的农艺性状。
同时,多态性也有助于保存和管理农作物和家畜的种质资源,避免它们遗失或衰退。
此外,多态性在进化生物学研究中也发挥了重要作用。
通过对物种中存在的不同基因型的组成和频率进行分析,可以探索群体遗传结构、分化和自然选择的模式。
多态性的存在可以提供物种适应环境变化的灵活性,并促进种群的演化。
通过对多态性的研究,可以深入了解种群和物种的适应性和进化历程,为进化生物学的研究提供重要的线索。
总结起来,多态性在遗传学中具有重要作用。
它在基因的检测和诊断、人口遗传学和人类进化、农业遗传改良和种质资源保护、以及进化生物学研究方面发挥着重要作用。
多态性的存在使遗传学家能够更好地理解个体之间的遗传差异,并从中获取有关遗传特征、物种多样性和进化历程的重要信息。
dna多态特点
dna多态特点
DNA多态性是指同一物种不同个体之间的DNA序列存在差异。
这种差异表现为个体间某些DNA片段的长度、序列或者结构存在差异,这些差异被称为多态性。
DNA多态性是生物进化的重要基础,它与个体的遗传、表型、疾病易感性等方面密切相关。
以下是DNA多态性的特点:
1. 广泛存在:DNA多态性普遍存在于各种生物物种中,包括人类、动物、植物等。
这种广泛存在使得生物具有多样性和适应性,能够适应不同的环境条件。
2. 遗传稳定性:DNA多态性具有遗传稳定性,也就是说,这种差异是可以遗传给后代的。
在人类中,一些多态性位点与某些疾病的发生密切相关,可以作为疾病预测和预防的指标。
3. 类型多样性:DNA多态性包括多种类型,如单核苷酸多态性(SNP)、微卫星多态性、插入/缺失多态性等。
这些不同类型的多态性在遗传学研究中具有不同的应用价值。
4. 表现复杂性:DNA多态性可以影响个体的表型和疾病易感性,这种影响可以是复杂的。
例如,某些多态性位点可以增加个体患某种疾病的风险,而另一些位点则可以降低风险。
这种复杂性使得对DNA多态性的研究需要深入探讨其与环
境因素之间的相互作用。
5. 技术依赖性:对DNA多态性的检测和分析需要依赖于先进的生物技术,如基因测序、基因芯片等。
这些技术的不断发展为深入研究DNA多态性提供了更多的可能性。
DNA多态性是生物多样性的重要基础,它具有广泛存在、遗传稳定性、类型多样性、表现复杂性和技术依赖性等特点。
对这些特点的深入了解有助于我们更好地理解生物进化、遗传和疾病发生的复杂性。
类与对象的实验总结
类与对象的实验总结类与对象是面向对象编程中的重要概念,通过对类与对象的实验,我深入了解了它们的基本概念、特性和使用方法。
首先是对类的实验。
一个类是对象的抽象模板,它描述了对象的共同属性和行为。
在实验中,我创建了一个名为“Person”的类来描述人的属性和行为。
在类中,我定义了属性包括姓名(name)、年龄(age)和性别(gender),并通过构造函数来初始化这些属性。
我还定义了方法来获取和设置属性的值,以及一个方法来展示人的信息。
通过实例化该类,我创建了不同的人对象,每个对象具有不同的属性值。
这样,一个类可以创建多个对象,每个对象都有相同的属性和方法,但属性值可以不同。
这使得代码的复用性大大提高,并且能够方便地对对象进行操作和管理。
接下来是对对象的实验。
一个对象是类的一个实例,它具有类定义的属性和行为。
在实验中,我通过实例化“Person”类来创建了不同的人对象。
通过调用对象的方法,我可以获取和设置对象的属性值,以及展示对象的信息。
对象可以根据需求动态地改变自己的属性值,从而实现了对数据的灵活处理。
同时,对象之间可以相互调用对方的方法,实现了不同对象之间的交互与合作。
通过使用对象,我可以更加方便地管理和操作数据,使代码更加模块化和可维护。
在实验中,我还学习了类的继承和多态的概念,并实际操作了它们。
继承是一种机制,允许一个类从另一个类继承属性和方法。
通过创建一个子类,我可以继承父类的属性和方法,并可以在子类中添加新的属性和方法,或者重写父类的方法。
这种继承的关系使得代码更加灵活和可扩展,可以根据不同的需求创建不同的子类。
多态是一种机制,允许一个对象使用多种形态。
通过创建一个父类的对象,我可以将其赋值给父类和子类的变量,通过调用不同的变量实现对不同的方法的调用。
多态提高了代码的灵活性和可扩展性,使得代码更加易于拓展和维护。
在实验过程中,我遇到了一些问题,并通过实践得到了解决。
首先是对类的理解问题,刚开始接触类的概念时,我对类和对象之间的关系有些模糊,以及如何正确使用类和对象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
定义基类
public class Centre { protected int x,y; public Centre() 构造函数 { } public Centre(int myx,int myy) { x = myx; 虚拟方法 y = myy; } public virtual string Print() { string str = "圆心坐标:(" + X.ToString() + "," + Y.ToString() + ")"; return str; } }
if(empls[i] is SE) 判断empl集合的元素是否 是SE对象
as 用于在兼容的引用类型之间执行转换
for (int i = 0; i < empls.Count;i++ ) { if(empls[i] is SE) { SE se = empls[i] as SE; 一种类型转换方式 Console.WriteLine(se.SayHi()); } …… 转换失败返回值为空 }
指导—员工执行工作列表
训练要点
抽象类和抽象方法
需求分析
实现员工执行工作列表
编码工作指标项:有效编码行数、遗留问题、工作日 测试工作指标项:测试用例个数、发现的Bug数、工作日
实现思路
搭建窗体 编写Job类 编写Job子类(TestJob、CodeJob),并实现抽象 Execute()方法 实现右键“执行”响应事件
任务描述:
设计计算器界面
通过多级继承,完成圆 面积和周长的计算、圆 柱体面积和体积的计 算。
任务 5.3
根据圆的半径计算圆面积
将圆心坐标定义为基类,在基类中包含坐标 X属性和Y属性,定义Print方法用来输出圆 心坐标位置 继承基类建立圆派生类,新增圆的半径R属 性,定义求圆面积和周长的方法,并重写 Print方法用来输出圆心坐标、圆面积和周长 将圆作为基类建立圆柱派生类,新增圆柱体 的高度Height这一属性,重写求面积方法, 改为求圆柱表面积,定义求体积的方法,重
抽象类的实际应用3-3
public abstract class Job { ......定义公共属性….. //执行 public abstract void Execute(); //显示 public abstract string Show(); }
抽象方法
打开不同工作类 public class CodeJob:Job 型的窗体,填写 { 指标执行情况 //实现抽象Job的Execute方法 public override void Execute() { FrmCodeExe frmCodeExe = new FrmCodeExe(this); frmCodeExe.ShowDialog(); } 传递当前对象 } 的引用 演示示例:抽象类的实际应用
虚方法 用 virtual 修饰 要有方法体,哪怕是一个分号 可以被子类 override
只能在抽象类中
除了密封类都可以写
抽象类中可以包括抽 象方法和非抽象方法
面向对象的三大特性 封装
隐藏内部实现,稳定外部接口
继承
子类继承父类成员,实现代码复用 Nhomakorabea多态
不同子类对同一个消息作出不同的反映
任务5.7 计算圆面积和周长、圆柱体面积和体积
多态的应用2-1
某公司员工回家,可以选择不同交通工具(小 汽车、地铁、自行车),每种交通工具具有行 驶的行为,编程模拟员工回家的过程
多态的应用2-2
交通工具具有继承关系 GoHome(TrafficTool tool)
父类类型作为参数
演示示例:多态的应用
父类类型作为参数2-1
实现交通工具继承关系
难点分析
不同器乐继承自Instrument类 员工具有Play(乐器类型)方法
public void Play(Instrument XX) {XX.Play();}
支持传入多种子类对象,避免 为每一个子类类型编写方法
共性问题集中讲解
共性问题集中讲解
常见调试问题及解决办法 代码规范问题
为什么需要抽象方法
小结
实现多态的步骤:
子类重写父类的方法 两种方式
创建父类变量,实例化子类对象 把父类类型作为参数类型,该子类及子类对象作为参数传 入
运行时,根据实际创建的对象决定执行哪个方法
指导—实现器乐演奏
训练要点
父类类型作为参数
完成时间:25分钟
需求说明
公司举办器乐大赛,员工可以选择不同的乐器进行 演奏,模拟演奏过程
第五单元(四)
深入理解多态
回顾与作业点评
在子类中访问父类成员的关键字是什么? 方法重载和方法重写的区别?
参考答案
笔记本支持用户使用电池(AcPower)和电源(Battery)两 种方式进行供电 使用多态性输出目前笔记本的电源供电情况“XX供电 中…”
预习检查
子类中定义抽象类的关键字是什么? as关键字的作用?
常见错误
抽象类不能被实例化
TrafficTool tool = new TrafficTool();
编译错误
抽象类不能是静态的
抽象类不能用 static修饰
实现抽象方法
使用override实现抽象方法
必须实现抽象父类 class Tube:TrafficTool 中的抽象方法 { public override void Run() { Console.WriteLine("地铁运行中!"); } } 重写
父类类型作为参数2-2
实现员工回家
父类作为参数使用,可 接受多种子类类型
public class Employee{ ...... public void GoHome(TrafficTool tool) { Console.WriteLine("员工:"+); tool.Run(); } } List<Employee> empls = new List<Employee>(); empls.Add(ai); 传递实际创建的子类对 empls.Add(joe); 象,tool.Run()执行相 应子类的Run() //员工选择不同交通工具回家 empls[0].GoHome(new Bicycle()); empls[1].GoHome(new Tube());
比如:抽象的动物类,具有抽象方法吃()、喝()
虚方法
具体类的默认实现,提供其子类扩展实现方式
比如:数据库连接类,Connect()方法实现与SQL Server 的连接,数据库连接子类继承并重写它,实现与MySQL连 接
抽象方法与虚方法
抽象方法 用 abstract 修饰 不允许有方法体 必须被子类 override
抽象类和抽象方法
一个没有实 现的方法
public abstract class TrafficTool { public abstract void Run(); } 抽象方法 有抽象方法的类必然是抽象类
抽象类用来列举一个类所需要的行为 抽象类不明确提供具体实现方法 抽象类必须由其子类实现它的抽象方法(除非 子类也具有抽象性)
抽象类的应用场合
父类提供一系列规定,约束子类的行为
abstract Animal abstract 叫()
父类可以提供一些共 性的行为
Cat : Animal 猫咪喵喵叫
Dog : Animal 狗狗汪汪叫
抽象类和抽象方法实 现多态性
对比虚方法
抽象类和抽象方法
抽象类通常代表一个抽象的概念 抽象方法约束子类对象的行为
public class TrafficTool { public virtual void Run() { Console.WriteLine("车在行使!"); } } public class Car:TrafficTool { public override void Run() { Console.WriteLine("小汽车在行使!"); } }
里氏替换原则(LSP)
在一个软件系统中,子类对象可以替换所有使用的父 类对象,且程序行为没有变化
里氏替换原则的应用
一个鸟类,一个鸵鸟类,如果鸟可以飞,鸵鸟类 可以继承鸟类吗?
如果鸵鸟类继承鸟类, 违反“鸵鸟会飞”
根据LSP原则:软件设计时,鸵鸟类不能继承鸟类
is与as操作符 is 检查对象是否与指定类型兼容
本章任务
使用OO思想
实现员工器乐演奏 实现员工执行工作列表、查看工作指标完成情况 实现饲养员给不同动物喂食
本章目标
理解里氏替换原则 会使用父类类型作为参数 理解抽象类和抽象方法 理解虚方法和抽象方法的区别
里氏替换原则
//… SE ai = new SE(); SE joe = new SE(); PM gates = new PM(); List<Employee> empls = new List<Employee>(); empls.Add(ai); 子类可以替换父类 empls.Add(joe); empls.Add(gates); //…
完成时间:25分钟
练习—查看工作指标完成情况
需求说明
实现员工查看工作指标完成情况
完成时间:15分钟
总结
实现面向对象的多态性有哪几种方法? 抽象类可以被继承吗? 抽象方法可以有方法体吗? 简述抽象方法和虚方法的区别?
交通工具类是抽象的概念,根 public class TrafficTool 本不可能实例化,Run()方法 { 不具有实际意义! public virtual void Run() { Console.WriteLine("车在行使!"); } }