.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"); }}
抽象类无法创建对象。但子类的对象调用方法时时调用父类的抽象方法(只不过内容被自己子类的方法重写了)
方法有实际意义用虚方法,无实际意义用抽象方法
时间: 2024-10-12 23:49:09