9

次のようなコードをテストしました。

class A
{
    public A() { }

    public virtual void Test ()
    {
        Console.WriteLine("I am A!");
    }
}

class B : A
{
    public B() { }

    public override void Test()
    {
        Console.WriteLine("I am B!");
        base.Test();
    }
}

class C : B
{
    public C() { }

    public override void Test()
    {
        Console.WriteLine("I am C!");
        base.base.test(); //I want to display here "I am A"
    }
}

そして、AクラスのCメソッドTest(祖父母のメソッド)から呼び出してみました。しかし、うまくいきません。祖父母の仮想メソッドを呼び出す方法を教えてください。

4

2 に答える 2

14

カプセル化に違反するため、できません。クラス B がある種の不変条件 (または何でも) を強制したいTest場合、クラス C がそれをバイパスできるとしたら、かなり厳しいものになります。

これが必要な場合は、設計に疑問を抱く必要があります。おそらく、継承関係の少なくとも 1 つが不適切ではないでしょうか? (個人的には、継承よりも構成を優先するようにしていますが、それは別の議論です。)

于 2011-10-04T13:50:24.913 に答える
5

1 つのオプションは、以下に示すように B で新しいメソッドを定義することです。

class B : A
{
    public B() { }

    public override void Test()
    {
        Console.WriteLine("I am B!");
        base.Test();
    }

    protected void TestFromA()
    {
        base.Test()
    }
}

TestFromA()Cで使用する

于 2011-10-04T13:52:50.120 に答える