虚方法与抽象方法

   虚方法 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();
        }
    }
原文地址:https://www.cnblogs.com/liuzhiye/p/2676680.html