0

コンストラクターのパラメーターに制約を設定する方法は?
それは良い習慣ですか?

インターフェイスがあり、Logger コンポーネントが必要です (ユニティによって注入される)。
すべての派生クラスが Logger コンポーネント (ILogger) をパラメーターとして持つようにするにはどうすればよいですか?

適切な解決策が見つかりませんでした。

私が見つけた唯一の回避策は、メソッドInitialize (<parameters>)をインターフェースに入れることです。これは醜いアプローチであり、特別な処理が必要です。

このような問題に対処する設計パターンはありますか?

4

2 に答える 2

3

派生クラスにロガー コンポーネントを持たせるための制約は必要ありません。基本クラスのコンストラクターを定義して、ILogger を受け取るだけです。

public class Foo
{
    public Foo (ILogger logger) { /* some implementation here */ }
}

public class Bar : Foo
{
    public Bar(ILogger logger)
        : base(logger)
    {
        // some implementation here
    }
}

Bar は Foo から派生しているため、ロガーを取るコンストラクターを使用する必要があります。Foo を抽象化することもできます。これにより、ユーザーは Foo 自体ではなく、派生クラスのインスタンスを作成する必要があります。

インターフェイスを定義する必要があるときは、C# インターフェイスだけを考えないでください。抽象クラスは、このような場合に最適です。抽象クラスを (C# インターフェイスではなく) インターフェイスと考えるのが一般的です。あなたが求めていることは、実装ではなくコントラクトを定義するため、C# インターフェイスでは実行できません。

于 2012-11-24T04:38:45.537 に答える
0

なぜあなたはそのようなことを強制したいのですか?

ロギングのような重要でないものではなく、実際のコントラクト(インターフェースによって定義される)に焦点を合わせます。コントラクトは、コア機能を実行する機能を失うことなくメソッド/プロパティを削除できないように定義する必要があります。

たとえば、インターフェースがある場合:

interface IAdder
{
    double Add(double first, double second);
}

追加はコア機能です。3番目の引数ILoggerを持つこともできますが、それがなくても追加できます。ロギングは実装の詳細であり、決して契約の一部であってはなりません。

于 2012-11-25T22:21:26.150 に答える