虚方法(virtual)和抽象方法(abstract)的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚方法(virtual)和抽象方法(abstract)的区别相关的知识,希望对你有一定的参考价值。

虚方法和抽象方法都可以供派生类重写。


  1. 虚方法必须有实现部分,抽象方法必须没有实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。如:


    class Program

    {

        static void Main(string[] args)

        {

            C c = new C();

            D d = new D();          

        }

    }


    abstract class A

    {

        public virtual void Sleep()

        {


        }       

        public virtual void N(); //报错,虚方法必须有实现部分(方法体).


        public abstract void M() //报错

        {


        }

        public abstract void Eat();//抽象方法必须没有实现部分(方法体)

    }


    class C : A

    {

        public override void Eat()

        {

            Console.WriteLine("Eat()被实现");

        }


        public override void M()

        {

            Console.WriteLine("M()被实现");

        }

    }


    class D : A  //报错,没有实现父类的抽象方法

    {

    }


2. 抽象方法只能在抽象类中声明;虚方法可以在抽象类中,也可以在非抽象类中。如:


    

    abstract class A

    {

        public virtual void Sleep()

        {


        }       


        public abstract void Eat();

    }


    class B

    {

        public virtual void Sleep() //虚方法可以在抽象类中,也可以在非抽象类中

        {


        }


        public abstract void Eat(); //报错,抽象方法不能在非抽象类中

    }


      

3. 抽象方法必须在派生类中重写(1.中class C 与 class D对比),这一点跟接口类似;虚方法可以在派    生类中重写,也可以不重写。虚方法在子类中重写时要加override。如:


    class A

    {

        public virtual void Sleep()

        {


        }             

    }


    class C : A

    {

        public override void Sleep()

        {

            Console.WriteLine("Sleep()被重写");      

        }

    }


    class D : A

    {

    }


以上是关于虚方法(virtual)和抽象方法(abstract)的区别的主要内容,如果未能解决你的问题,请参考以下文章

C#虚方法(Virtual)抽象方法(Abstract),接口(Interface)抽象类的区别

虚方法virtual抽象方法abstract接口interface区别

转载 [c#] 虚函数(Virtual),抽象函数(abstract)和接口的区别

虚方法与抽象方法

虚方法和抽象类

C# 抽象方法和虚方法的区别