虚方法与抽象方法
虚方法 virtual,虚方法给父类提供了一种默认的实现,子类可以使用override重写虚方法,虚方法不能出现在密封类(sealed)中。
抽象类,不能被实例化,但可以实例化其子类的对象,抽象方法必须出现在抽象类中,抽象方法必须在子类中重写。子类继承抽象类,必须重写抽象类中所有的抽象方法(除非子类也是抽象类)
作为父类来用,抽象类给子类提供公共的实现(非抽象方法)和能力,为子类提供所需要的成员,抽象类中也可以有实现
让父类引用指向子类对象,把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。所有的方法掉用都通过父类 类似于中转
虚方法与抽象方法的区别
1 虚方法必须有实现部分(默认实现 在子类中根据需要修改),抽象方法没有提供实现部分
2 抽象方法必须在抽象类中声明,虚方法可以在类中实现
3 抽象方法必须在子类中重写,虚方法可以被重写
下面用代码来说明:
定义三个类 Animal Cat Dog Animal为父类 含有Cat和Dog共有的Say()方法
Animal :
abstract class Animal { //虚方法 public virtual void Say() { Console.WriteLine("喵喵.."); } //共有方法 public void Eat() { Console.WriteLine("吃宠物粮"); } //抽象方法不能有实现 abstract public void Sleep(); }
Cat : 实现父类中的抽象方法
class Cat:Animal { //重写抽象方法 public override void Sleep() { Console.WriteLine("白天睡觉"); } }
Dog:重写父类中定义的Say()虚方法
class Dog:Animal { //重写Say()方法 public override void Say() { Console.WriteLine("旺旺旺"); } public override void Sleep() { Console.WriteLine("晚上睡觉"); } }
看看调用: Animal为抽象方法,不能直接实例化。这里实例化子类并存放在数组中
class Program { static void Main(string[] args) { Animal[] cd ={ new Cat(), new Dog() }; foreach (Animal item in cd) { item.Eat(); //当item为Dog类型的时候item.Say()会调用dog类中的方法而不是父类Animal中的Say()方法 //先扫描子类Dog中是否有Say()方法 如果没有的话才会调用父类中Say()方法 item.Say(); item.Sleep(); } Console.Read(); } }