一、面向对象基础之多态
面向对象里最高级的一个特征!
概念:让一个对象能够表现出多种状态(类型)
有多个类继承自同一个类,同名的方法中功能却不同,如果要写的话,要单独每一个写一下
Chinese cn1 = new Chinese("韩梅梅");
Chinese cn2 = new Chinese("李雷");
Japanese j1 = new Japanese("树下君");
Japanese j2 = new Japanese("井边子");
Korea k1 = new Korea("金秀贤");
Korea k2 = new Korea("金贤秀");
American a1 = new American("科比");
American a2 = new American("奥尼尔");
Person[] pers = {cn1,cn2,j1,j2,k1,k2,a1,a2};
for(int i=0;i<pers.Length;i++)
{
// if(pers[i] is Chinese)
// ((Chinese)pers[i]).SayHello();
// if(pers[i] is Japanese)
// ((Japanese)pers[i]).SayHello();
// if(pers[i] is Korea)
// ((Korea)pers[i]).SayHello();
// if(pers[i] is American)
// ((American)pers[i]).SayHello();
//是否可以简化以上代码,使用一个对象表象出多种类型,用一个对象完成上述功能
pers[i].SayHello();
实现多态的3种手段:
1、虚方法;
1)第一步:将父类的方法标记为虚方法,使用关键字---virtual,说明这个方法可以被重写(这个函数也可以被调用,也可以实现功能)
public virtual void <span style="font-family: Arial, Helvetica, sans-serif;">SayHello</span>()
2)第二步:在子类的此同名方法使用关键字----override,重写这个方法
public override void <span style="font-family: Arial, Helvetica, sans-serif;">SayHello</span>()
pers[i].SayHello();
就会自动调用相应的子类的方法,多种输出
2、抽象类;
当父类中的方法不知道如何去实现的时候,可以考虑将父类写成“抽象类”,将父类的方法写成抽象方法,用关键字:abstract
public abstract class Animal
{
public abstract void Bark(); //抽象方法---没有方法体: 存在的意义就是让方法重写,来实现多态
}
子类重写也是用关键字override
抽象类不能创建对象,只能创建子类的对象
Animal a = new Dog();
具体调用哪个方法取决于创建哪个子类的对象
要注意的地方:
1)抽象类的抽象成员,必须是抽象的,不能有任何实现,并且子类必须重写;
2)抽象类可以有非抽象成员,子类能继承并且不需要重写
3)抽象类不能实例化(不能创建对象)
4)子类必须重写父类的所有抽象类,除非子类也是抽象类
5)子类重写抽象方法时,参数和返回值必须一一对应(一样)
如果父类中的方法有默认的实现,并且父类需要实例化(创建对象),这种多态用”虚方法“实现,父类定义成普通类
如果父类中的方法不需要默认的实现,并且不需要实例化(创建对象),这种多态就用”抽象类“来实现,把父类定义成抽象类