インターフェイスでのコンストラクター シグネチャの宣言
C# では、インターフェイスでメソッドのシグネチャを定義できますが、コンストラクターを含めることはできません。これは、特にオブジェクトのインスタンス化中に特定のプロパティまたはリソースにアクセスする必要があるシナリオでは、特有の課題を引き起こします。
代替アプローチ:
IObservable パターン:
ドローアブル オブジェクトが次へのアクセスを必要とする場合グラフィックス デバイス マネージャーの場合は、IObservable パターンの実装を検討してください。グラフィックス デバイス マネージャーは、ドローアブル オブジェクトのイベントをサブスクライブして、必要な更新や描画機能を実現できます。
基本クラスのコンストラクターはグラフィックス デバイス マネージャーを初期化し、それを派生クラスのコンストラクターに渡すことができます。このアプローチにより、派生クラスはインターフェイスの署名に違反することなく必要なリソースにアクセスできるようになります。
静的インターフェイス (将来の概念):
として参照されているブログ投稿で述べられているように、静的インターフェイスでは、汎用制約でのみ使用するコンストラクター シグネチャを定義することで、この問題を解決できます。ただし、これは現在 C# では使用できません。
インターフェイスでのコンストラクター定義の影響:
インターフェイス内でコンストラクターを定義すると課題が発生します。クラスの派生において。派生クラスはインターフェイスのコンストラクターを継承し、互換性のない署名やコードの破損につながる可能性があります。
たとえば、インターフェイスがパラメーターなしのコンストラクターを定義している場合:
public interface IParameterlessConstructor { public IParameterlessConstructor(); }
そして、基本クラスがそれを実装します。
public class Foo : IParameterlessConstructor { public Foo() // As per the interface { } }
派生クラスは、次のような独自のコンストラクターを定義できません。パラメータ:
public class Bar : Foo { // Yikes! We now don't have a parameterless constructor... public Bar(int x) { } }
最終的には、コンストラクターをインターフェイスで明示的に定義することはできませんが、インターフェイスの目的を損なうことなく、目的の機能を実現するために、さまざまな回避策や設計パターンを採用できます。
以上がC# のインターフェイスでコンストラクターの署名が許可されていない場合、オブジェクトのインスタンス化中にリソースにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。