.Net学习 第2季07 C#面向对象 多态

爷,独闯天下 提交于 2020-04-07 01:59:21

.Net 视频学习第2季 C#面向对象

 

面向对象 多态

概念:让一个(父类)对象表现出多种(子类)类型的特性;三种方法:虚方法/抽象类/接口

方法一:虚方法

将父类方法标记为虚方法,使用关键字virtual在返回值类型前,这个方法可以被子类重写一遍(在子类方法返回值类型前使用关键字override)

没有使用虚方法下:

public class Person
{    private string _name;    public string Name    {        get{return _name;}     set{_name = value;}    }    public Person(string name)    {        this.Name = name;    }    public void SayHello()    {        Console.WriteLine("I am a person");    }
}
public class Chinese:Person
{    public Chinese(string name):base(name)    {    }    public void SayHello()    {        Console.WriteLine("I am Chinese");    }
}

public class Japanese:Person
{    public Japanese(string name):base(name)    {    }    public void SayHello()    {        Console.WriteLine("I am Japanese");    }
}

创建Person[]数组,将Chinese和Japanese的对象放进去(里氏转换),再遍历数组成员调用其SayHello()方法,将全部得到I am a person,因为尽管放进去的是Chinese和Japanses的对象,但是数组本身是Person数组,所以成员会被解释成Person类型的对象,从而只能调用父类Person的SayHello()方法。要想得到子类的方法调用,需要进行强制类型转换。

Person
{
  ...  public virtual void SayHello(){}
}Chinese:Person{  ....  public override void SayHello(){}}Japanese:Person{  ....  public override void SayHello(){}}

通过上述的虚方法,在数组中不需要进行强制转换,Chinese/Japanese的对象会调用各自子类中的SayHello()。

实质:调用的依然是父类的方法,但是该方法已被子类重写,至于选择哪个子类的重写版本,取决于该父类对象装的是哪个子类对象(如果没有装子类对象,就是父类对象本身,则会调用父类方法)

 

方法二:抽象类

当父类的方法不确定如何实现的时候,可以选择将父类写成抽象类,同时父类方法写为抽象方法,使用关键字abstract,注意抽象方法不允许有方法体(就是说没有那一对大括号)

---父类方法有默认实现,并且父类需要实例化,用虚方法

---父类方法没有默认实现,并且父类不需要实例化,用抽象类

public abstract class Animal
{
  public abstract void Bark();
}public class Dog:Animal{    public override void Bark()  {    Console.WriteLine("XXXX");  }}
public class Cat:Animal{    public override void Bark()  {    Console.WriteLine("YYYY");  }}
 

抽象类无法创建对象。但子类的对象调用方法时时调用父类的抽象方法(只不过内容被自己子类的方法重写了)

注意抽象类中可以有非抽象成员(虽然父类无法调用---因为父类无法实例化,但这些成员依然会被子类继承),子类需要重载父类所有的抽象成员(除非子类本身也是一个抽象类),属性本质上是两个方法,所以也需要重载。快速重载所有抽象成员的快捷键是alt+shift+F10(和快速导入类的命名空间一样,类的左下角有蓝色方框即可使用此快捷键)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!