一見すると、インターフェイスの実装と仮想メソッドのオーバーライドには違いがないように見えますが、実際には、インターフェイスの実装と仮想メソッドのオーバーライドには大きな違いがあります。 ! !
インターフェイスで宣言されたメンバーメソッドはデフォルトでは仮想メソッドではないため、派生クラスはインターフェイスを実装する基本クラスの非仮想メンバーをオーバーライドできません。
例を見てみましょう。
インターフェイス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();
出力結果は次のとおりです:
b および d インスタンス Test メソッドによって実装される動作はすべて基本クラスにあります。 ! !これは、派生クラスが基本クラスのインターフェイスを実装するメンバー (非仮想メソッド) をオーバーライドできないことを示しています
ただし、次の呼び出しを見てください:
Base b = new Base(); b.Test(); Derive d = new Derive(); //将d声明为Derive对象 d.Test(); Console.ReadLine();
出力結果は次のとおりです:
したがって、継承したいオブジェクトは、インターフェース実装メソッドを呼び出すための派生インスタンスとして宣言することしかできません。これは、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"); } }
上記のコードを観察すると、基底クラスに実装されたインターフェイスについて、派生クラスもこのインターフェイスを実装したい場合、デフォルトのインターフェイス実装では基本クラスを継承するため、インターフェイスを実装するコードを繰り返し記述する必要はありません。
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 サイトの他の関連記事を参照してください。