0

ベースから継承する一連のクラスがあります...

public abstract class BaseClass
{
    public BaseClass()
    {
        // ...
    }
}

public abstract class BaseMessageClass : BaseClass
{
    // ...
}

public SpecificMessageClass : BaseMessageClass
{
   // ...
}

このようにオブジェクトをインスタンス化すると、次のようになります。

SpecificMessageClass myMessage = new SpecificMessageClass();

ただし、次のように、すべてのコンストラクターをオプションの文字列パラメーターに変更する必要があります。

public abstract class BaseClass
{
    public BaseClass(string optParam="whatever")
    {
        // ...
    }
}

ここで、オプションの引数を使用してオブジェクトをインスタンス化しようとすると、次のようになります。

SpecificMessageClass myMessage = new SpecificMessageClass("coolstring");

エラーが発生します:

'SpecificMessageClass' には、1 つの引数を取るコンストラクターが含まれていません"

継承されたクラスの各レベルでコンストラクターを明示的に宣言せずにこれを行う方法はありますか?

4

2 に答える 2

1

いいえ。

しかし、継承したいのであれば、継承されたフィールドまたはプロパティのすべてのレベルで同じロジックを適用する必要があると思います。その場合、次のように基本クラスに Create<T>(string optParam="whatever") のようなファクトリ メソッドを追加するのが最も近い方法です。

public class BaseClass
{
    public static T Create<T>(string optParam="whatever") where T : BaseClass
    {
        var t = new T(); //which invokes the paramterless constructor
        ((BaseClass)t).SomePropertyOrFieldInheritedFromTheBaseClass = optParam; //and then modifies the object however your BaseClass constructor was going to.
        return t;
    }
}

これにより、クラスのすべての実装者が BaseClass を実装し、オプションのパラメーター コンストラクターを持つのと同じ効果を得ることができます。

ところで、上記のコードはテストしていないので、少し調整する必要があるかもしれません。しかし、うまくいけば、それはアイデアを与える.

多分それが一番近道だと思います。

于 2016-04-15T00:45:58.800 に答える