1. ホーム
  2. c#

[解決済み] コンストラクタのシグネチャを定義するインターフェース?

2022-03-16 16:54:49

質問

初めてぶつかる問題で変なのですが、、、。

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 コンストラクタに複数のパラメータを渡す必要がある場合は、渡す必要のあるすべてのフィールドのプロパティを定義するクラスを作成します。