1

クラス継承で現在のクラスメソッドを呼び出すことは可能ですか?

クラスAとAを継承するクラスBがあるとします。両方に「initialize」メソッドがあります。つまり、Bでオーバーライドされます。「base.initialize」を使用してそこからAの「initialize」を呼び出すことはできません。 。代わりに、継承されたすべてのクラスに対して呼び出される下位クラスのコンストラクター(つまりAのコンストラクター)から呼び出そうとしています。

そこで、AのコンストラクターでAの「初期化」を呼び出したいと思います。しかし、それを試してみると、Bのオーバーライドコンストラクターが呼び出されます。

それで、VS(またはc#)に、現在存在するクラスimのメソッドを明示的に呼び出している(this.method()が機能しなかった)ことを伝える何かがありますか?

4

2 に答える 2

1

メソッドを仮想としてマークInitializeすると、派生クラスがそのメソッドを自由にオーバーライドできることを意味しbase.Initialize、プロセスで呼び出されない可能性があります。そのシナリオが発生しても問題がない場合は、メソッドを仮想としてマークしないでください。

Initializeあなたの場合、各クラスに2つのプライベートメソッドが必要なようです。

public class A
{
    public A()
    {
        Initialize();
    }

    private void Initialize()
    {
    }
}

public class B : A
{
    public B()
    {
        Initialize();
    }

    private void Initialize()
    {
    }
}

または、テンプレートメソッドのデザインパターンを確認することもできます。次のようにクラスを設計できます。

public class A
{
    public A()
    {
        Initialize();
    }

    private void Initialize()
    {
        // Initialize the base class A.

        // Then call DerivedInitialize. If this is actually a derived object,
        // DerivedInitialize will initialize the derived instance. Otherwise,
        // it won't do anything.
        DerivedInitialize();
    }

    protected virtual void DerivedInitialize()
    {
    }
}

public class B : A
{
    public B()
    {
        Initialize();
    }

    protected override void DerivedInitialize()
    {
        // Initialize B-specific stuff...
    }
}
于 2012-12-14T20:35:06.063 に答える
0

あなたのコンテンツをA.initialize()新しいプライベート非仮想メソッドに入れます。Aのコンストラクタとからこの新しいメソッドを呼び出しA.initialize()ます。

于 2012-12-14T20:31:13.013 に答える