-3

子コンストラクターから基本コンストラクターを呼び出すのがベスト プラクティスですか? ここでベースはabstract class.

サンプルコードはこちら

abstract class MyBase
{
    String l_strChildName;
    public MyBase(String Name)
    {
        l_strChildName = Name;
    }

    public abstract void func();
}

class MyChild_One : MyBase
{
    public MyChild_One() : base("MyChild One") { }

    public override void func()
    {

    }
}

class MyChild_Two : MyBase
{
    public MyChild_Two() : base("MyChild Two") { }

    public override void func()
    {

    }
} 

この呼び出しメカニズムはベスト プラクティスですか?

4

5 に答える 5

2

基本クラスは、設計上、すべての派生クラスに共通する機能をカプセル化する必要があります (継承されるため)。基本クラスのコンストラクターを介して初期化するフィールド/プロパティがすべての派生クラスの初期化に関連している場合、はい、キーワードを介して基本クラスのコンストラクターに渡すことがbase正しいアプローチです。

あなたの場合、基本クラスは抽象的であり、その唯一のコンストラクターはパラメーターを必要とするため、baseキーワードの使用は実際には必須になります。クラス階層からインスタンスを初期化する他の方法はありません。

あなたが提供した例は、質問のために考案されたと思います。クラス名をハードコーディングしないでください。GetTypeメソッド (またはキーワード) を使用isして、実行時にインスタンスの実際の型を識別することができます。

MyBase x = new MyChild_One();
Console.WriteLine(x.GetType().Name);   // Outputs "MyChild_One" 

値が変更されないフィールド/プロパティの場合、すべての派生クラスによってオーバーライドされる抽象的な読み取り専用プロパティを使用することもできます。

abstract class MyBase
{
    public abstract String l_strChildName { get; }
}

class MyChild_One : MyBase
{
    public override String l_strChildName 
    { 
        get { return "MyChild One"; }
    }
}

class MyChild_Two : MyBase
{
    public override String l_strChildName 
    { 
        get { return "MyChild Two"; }
    }
} 
于 2012-06-04T05:51:23.197 に答える
1

クラスの基本コンストラクターは、クラス自体のコンストラクターが実行される前に常に呼び出されます。":base( value )" 構文は、パラメーターを渡す方法にすぎません。デフォルトのコンストラクターを呼び出したい場合は、":base()" を記述する必要はありません。とにかく呼び出されます。

于 2012-06-04T05:57:13.480 に答える
1

基本クラスのコンストラクターにはパラメーターが必要ですが、子には必要ありません。この場合、基本コンストラクターの呼び出しを回避する方法がわかりません-必須です

于 2012-06-04T05:53:41.030 に答える
0

基本クラスに対して定義されるコンストラクターは 1 つしかないため、それを呼び出す必要があります。

複数定義されている場合は、どれを呼び出すかを選択できます。

基本クラスにデフォルトのコンストラクターがある場合は、明示的に呼び出すことを省略します。例えば。

: base()

必須ではありません。ただし、明示的に指定しなくてもコンパイラが呼び出しを発行するだけで、呼び出されないという意味ではありません

于 2012-06-04T05:57:12.670 に答える