C# デザイン パターン - 非仮想インターフェイス トラップを実装するための派生クラスのコード共有例

黄舟
リリース: 2017-03-18 13:23:43
オリジナル
1343 人が閲覧しました

インターフェイス メソッドと仮想メソッドの違いを理解する

一見すると、インターフェイスの実装と仮想メソッドのオーバーライドには違いがないように見えますが、実際には、インターフェイスの実装と仮想メソッドのオーバーライドには大きな違いがあります。 ! !

派生クラスはインターフェイスの非仮想メンバーをオーバーライドできません

インターフェイスで宣言されたメンバーメソッドはデフォルトでは仮想メソッドではないため、派生クラスはインターフェイスを実装する基本クラスの非仮想メンバーをオーバーライドできません
例を見てみましょう。
インターフェイスITestを定義します:

    public interface ITest
    {        void Test();
    }
ログイン後にコピー

インターフェイスのBaseクラスとDeriveクラスを実装します

    public class Base:ITest
    {        public Base()
        {
            Console.WriteLine("This is base constructor");
        }        //实现ITest接口
        public void Test()
        {
            Console.WriteLine("This is in base to ITest implement");
        }
    }    public class Derive :Base,ITest
    {        public Derive()
        {
            Console.WriteLine("This is derived constructor");

        }        //测试Derive类实现了ITest吗??
        public void Test()
        {
            Console.WriteLine("This is in Derive to ITest implement");
        }
    }
ログイン後にコピー

オブジェクトを呼び出しますBaseとDerive:

            Base b = new Base();
            b.Test();

            Base d = new Derive();//将d声明为Base对象
            d.Test();
            Console.ReadLine();
ログイン後にコピー

出力結果は次のとおりです:


C# デザイン パターン - 非仮想インターフェイス トラップを実装するための派生クラスのコード共有例

b および d インスタンス Test メソッドによって実装される動作はすべて基本クラスにあります。 ! !これは、派生クラスが基本クラスのインターフェイスを実装するメンバー (非仮想メソッド) をオーバーライドできないことを示しています

ただし、次の呼び出しを見てください:

            Base b = new Base();
            b.Test();
            Derive d = new Derive(); //将d声明为Derive对象
            d.Test();
            Console.ReadLine();
ログイン後にコピー

出力結果は次のとおりです:


C# デザイン パターン - 非仮想インターフェイス トラップを実装するための派生クラスのコード共有例

したがって、継承したいオブジェクトは、インターフェース実装メソッドを呼び出すための派生インスタンスとして宣言することしかできません。これは、Effective C#変数 がすべて基本インスタンスとして宣言されるという原則に準拠していません。 ! !

派生クラスのメソッドのパーソナリティ、基本クラスのメソッドを仮想メソッドに変換します

使用上のこの混乱を避けるために、派生クラスの実装メソッドがパーソナリティの動作であることが本当の場合は、基本クラスの前に仮想修飾子を追加する必要があります実装インターフェースメソッド!
コードは次のように変更されます:

public class Base:ITest
    {        public Base()
        {
            Console.WriteLine("This is base constructor");
        }        public virtual void Test() //实现ITest接口的虚方法
        {
            Console.WriteLine("This is in base to ITest implemnt");
        }
    }    public class Derive :Base,ITest
    {        public Derive()
        {
            Console.WriteLine("This is derived constructor");

        }         public override void Test() //实现接口ITest的复写方法
        {
            Console.WriteLine("This is in Derive to ITest implemnt");
        }
    }
ログイン後にコピー

1 つの実装で、複数の関連オブジェクトが使用されます

上記のコードを観察すると、基底クラスに実装されたインターフェイスについて、派生クラスもこのインターフェイスを実装したい場合、デフォルトのインターフェイス実装では基本クラスを継承するため、インターフェイスを実装するコードを繰り返し記述する必要はありません。

   public interface ITest
    {        void Test();
    }    public class Base:ITest
    {        public Base()
        {
            Console.WriteLine("This is base constructor");
        }        public void Test()
        {
            Console.WriteLine("This is in base to ITest implemnt");
        }
    }    public class Derive :Base,ITest
    {        public Derive()
        {
            Console.WriteLine("This is derived constructor");

        }
    }
ログイン後にコピー

概要:
1. 派生はインターフェイスの非仮想メンバーをオーバーライドできません。
2. 派生クラスのメソッドがパーソナライズされたメソッドである場合、基本クラスが実装する場合。インターフェイス メソッド、convert 派生クラスもこのインターフェイスを明示的に継承しますが、再度実装する必要はありません。 ! !

以上がC# デザイン パターン - 非仮想インターフェイス トラップを実装するための派生クラスのコード共有例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!