[解決済み] コンストラクタのシグネチャを定義するインターフェース?
質問
初めてぶつかる問題で変なのですが、、、。
C#のインターフェイスでコンストラクタを定義するにはどうしたらいいですか?
編集
例が欲しいという声もありました(自由時間プロジェクトなので、そう、ゲームなんです)
IDrawable
+更新
+描画
更新(画面の端のチェックなど)および描画を行うには、常に
GraphicsDeviceManager
. だから、オブジェクトがそれへの参照を持っていることを確認したい。これはコンストラクタに含まれるでしょう。
今こうして書いてみると、ここで実装しているのは
IObservable
と、その
GraphicsDeviceManager
を取る必要があります。
IDrawable
...
私がXNAのフレームワークを理解していないか、フレームワークがあまり考えられていないかのどちらかのようです。
編集
インターフェイスの文脈における私のコンストラクタの定義について、いくつかの混乱があるようです。インターフェースは確かにインスタンス化できないので、コンストラクタは必要ありません。私が定義したかったのは、コンストラクタのシグネチャです。インターフェースが特定のメソッドのシグネチャを定義できるのと同じように、インターフェースはコンストラクタのシグネチャを定義することができるのです。
どうやって解決するの?
すでに述べたように、インターフェイスにコンストラクタを持つことはできません。 特に、既存のInterfaceと一緒に抽象的な基底クラスを使用する方法を紹介し、将来、同様の状況で必要となるリファクタリングの量を減らすことができるかもしれません。 このコンセプトは、すでにいくつかのコメントで示唆されていますが、実際にどのように行うかを示す価値があると思いました。
ここまででメインインターフェイスはこのようになりますね。
public interface IDrawable
{
void Update();
void Draw();
}
ここで、強制したいコンストラクタを持つ抽象クラスを作成します。 実は、あなたが最初の質問を書いたときから、ジェネリックを使うことができるようになったので、ここで少し気を使って、同じ機能を必要とするがコンストラクタの要件が異なる他のインタフェースにこれを適応させることができます。
public abstract class MustInitialize<T>
{
public MustInitialize(T parameters)
{
}
}
さて、IDrawable インターフェースと MustInitialize 抽象クラスの両方を継承した新しいクラスを作成する必要があります。
public class Drawable : MustInitialize<GraphicsDeviceManager>, IDrawable
{
GraphicsDeviceManager _graphicsDeviceManager;
public Drawable(GraphicsDeviceManager graphicsDeviceManager)
: base (graphicsDeviceManager)
{
_graphicsDeviceManager = graphicsDeviceManager;
}
public void Update()
{
//use _graphicsDeviceManager here to do whatever
}
public void Draw()
{
//use _graphicsDeviceManager here to do whatever
}
}
あとはDrawableのインスタンスを作成すればOKです。
IDrawable drawableService = new Drawable(myGraphicsDeviceManager);
ここでクールなのは、新しく作った Drawable クラスが、IDrawable に期待されるものと同じように動作することです。
MustInitialize コンストラクタに複数のパラメータを渡す必要がある場合は、渡す必要のあるすべてのフィールドのプロパティを定義するクラスを作成します。
関連
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
-
[解決済み】「インターフェースに合わせたプログラム」とはどういう意味ですか?
-
[解決済み] コンストラクトシグネチャを持つインターフェースはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない