25

自分のコンストラクターを呼び出した後、基本クラスのコンストラクターを呼び出すにはどうすればよいですか?

x問題は、基本クラスのコンストラクターが、サブクラスのコンストラクターで初期化されたvariable にアクセスする必要がある抽象メソッド (サブクラスでオーバーライドされる) を呼び出すことです。

短いコード例:

abstract class BaseClass
{
    protected string my_string;

    protected abstract void DoStuff();

    public BaseClass()
    {
        this.DoStuff();
    }
}

class SubClass : BaseClass
{
    private TextBox tb;

    public SubClass()
        : base()
    {
        this.my_string = "Short sentence.";
    }

    protected override void DoStuff()
    {
        // This gets called from base class' constructor
        // before sub class' constructor inits my_string
        tb.Text = this.my_string;
    }
}

編集:回答に基づいて、明らかに不可能です。this.DoStuff();作成されたすべてのオブジェクトを自動的に呼び出す方法はありSubClassますか? もちろんthis.DoStuff();、サブクラスのコンストラクターの他のすべての行の後に追加することもできますが、これらのクラスが約 100 あると、ばかげているように感じます。他の解決策、または手動の解決策を使用する必要がありますか?

4

4 に答える 4

30

できません。

virtualまた、通常、コンストラクターでメソッドを呼び出すべきではありません。この回答を参照してください。


作成した単純な例ではなく、実際のコードによっては、基本コンストラクターとDoStuffメソッドのパラメーターとして値を渡すことができます。例えば:

abstract class BaseClass
{
    private string my_string;

    protected abstract void DoStuff(string myString);

    public BaseClass(string myString)
    {
        this.my_string = myString;
        this.DoStuff(this.my_string);
    }
}

class SubClass : BaseClass
{
    private TextBox tb;

    public SubClass()
        : base("Short sentence.")
    {
    }

    protected override void DoStuff(string myString)
    {
        tb.Text = myString;
    }
}

実際のコードでそれが不可能な場合は、複数書くDoStuff()とうまくいきます。また、クラスを封印することを忘れないでください。SubClassそうすれば、他の人がDoStuffメソッドをもう一度変更してバグを持ち込むことができなくなります。

于 2013-01-28T13:15:03.163 に答える
5

メソッドを呼び出すインスタンスのコンストラクターが実行されていない可能性があるため、コンストラクターで抽象メソッドを呼び出しません

仮想メソッドが呼び出されると、メソッドを実行する実際の型は実行時まで選択されません。コンストラクターが仮想メソッドを呼び出すとき、メソッドを呼び出すインスタンスのコンストラクターが実行されていない可能性があります。この規則違反を修正するには、型のコンストラクター内から型の仮想メソッドを呼び出さないでください。

http://msdn.microsoft.com/en-us/library/ms182331%28v=vs.80%29.aspx

于 2013-01-28T13:14:46.400 に答える