C#での抽象メソッドと仮想メソッドの違い

1.抽象メソッド:抽象クラスでのみ定義され、メソッド修飾子はプライベート、仮想、静的を使用できません

抽象メソッドコードは次のとおりです。


        public abstract class People   //声明一个抽象类
        {
    
    
            public abstract void study();  //抽象方法只能定义在抽象类中。
        }

        public class Student : People   //继承抽象类
        {
    
    

            public override void study()     //重写抽象类的抽象方法
            {
    
    
                Console.WriteLine("好好学习,天天向上!");
            }
        }

        public class Program
        {
    
    

            static void Main(string[] args)
            {
    
    
                Student t = new Student();//实例化派生类

                People p = t;   //使用派生类对象实例化抽象类

                //以上两句等价于  People p = new Student();//使用派生类对象实例化抽象类;

                p.study(); //使用抽象类对象调用抽象类中的抽象方法study    

            }
        }

ここに画像の説明を挿入
概要:
1。同様のメソッドは、キーワードabstractを使用して抽象クラスでのみ宣言できます
。2。抽象クラスの抽象メソッドはサブクラスでオーバーライドする必要があります
抽象メソッドにはメソッド本体がなく、サブクラスはメソッド本体をオーバーライドする必要があります!!したがって、抽象メソッドはメソッド本体のない仮想メソッドと見なすことができます

第二に、仮想メソッド:仮想変更を使用するメソッド:

仮想メソッドはメソッド本体を持つことができます。具体的な例は次のとおりです。



    public class BaseClass         //创建一个基类
    {
    
    
        public virtual string GetName()    //使用virtual关键字创建父类中的虚方法
        {
    
    
            return "父类虚方法体";   
        }
    }

    public class SubClass : BaseClass    //子类继承父类
    {
    
    
        public override string GetName()   //子类重写父类虚方法
        {
    
    
            return "重写父类虚方法!";
        }
    }

上記の例:親クラスの仮想メソッドは、派生クラスによってオーバーライドされます。

注:仮想修飾子は、private、static、abstract、およびoverride修飾子と同時に使用することはできません。

ps:オーバーライド修飾子は、new、static、およびvirtual修飾子と同時に使用することはできません。また、overrideメソッドは、基本クラスの仮想メソッドをオーバーライドするためにのみ使用できます。

仮想関数の制限:
1。仮想関数は、継承関係を持つクラスオブジェクトにのみ適用できるため、クラスのメンバー関数のみを仮想関数として記述できます
。2。静的メンバー関数、インライン関数、およびコンストラクターを仮想関数にすることはできません
。3 。デストラクタは仮想関数にすることができます。

3、2つの違い:
要約:

抽象メソッドはメソッド名のみであり、メソッド本体はなく(つまり、メソッドは実装されていません)、サブクラスは親抽象メソッドをオーバーライドする必要があります。
仮想関数は、メソッドにメソッド本体がありますが、サブクラスがそれをカバーできる場合とカバーできない場合があります。

1.仮想メソッドにはメソッド本体があり、抽象メソッドにはメソッド本体がありません。抽象メソッドは、派生クラスを強制的にオーバーライドするメソッドです。オーバーライドしないと、派生クラスはインスタンス化されません。
2.抽象メソッドは抽象クラスでのみ宣言できますが、仮想メソッドは宣言できません。
3.派生クラスは、抽象クラスの抽象メソッドを書き換える必要があり、仮想メソッドは必要ありません。

おすすめ

転載: blog.csdn.net/qq_37192571/article/details/109066717