1

「次のコードを想定します。

public class MultiplasHerancas
{
    static GrandFather grandFather = new GrandFather();
    static Father father = new Father();
    static Child child = new Child();

    public static void Test() 
    {
        grandFather.WhoAreYou();
        father.WhoAreYou();
        child.WhoAreYou();

        GrandFather anotherGrandFather = (GrandFather)child;
        anotherGrandFather.WhoAreYou(); // Writes "I am a child"
    }

}

public class GrandFather
{
    public virtual void WhoAreYou() 
    {
        Console.WriteLine("I am a GrandFather");
    }
}

public class Father: GrandFather
{
    public override void WhoAreYou()
    {
        Console.WriteLine("I am a Father");
    }
}

public class Child : Father 
{
    public override void WhoAreYou()
    {
        Console.WriteLine("I am a Child");

    }
}

「子供」オブジェクトから「私はおじいさんです」と出力したいです。

Child オブジェクトが「base.base」クラスでメソッドを実行するにはどうすればよいですか? ベースメソッドを実行できることはわかっていますが(「私は父です」と出力します)、「私は祖父です」と出力したいのです!これを行う方法があれば、OOP 設計で推奨されますか?

注:私はこの方法を使用していません/使用します。知識の継承を強化したいだけです。

4

3 に答える 3

5

これは、メソッド非表示を使用してのみ可能です-

public class GrandFather
{
    public virtual void WhoAreYou()
    {
        Console.WriteLine("I am a GrandFather");
    }
}

public class Father : GrandFather
{
    public new void WhoAreYou()
    {
        Console.WriteLine("I am a Father");
    }
}

public class Child : Father
{
    public new void WhoAreYou()
    {
        Console.WriteLine("I am a Child");            
    }
}

そして、このように呼び出します -

Child child = new Child();
((GrandFather)child).WhoAreYou();

newキーワードを使用しhides the inherited member of base class in derived classます。

于 2013-08-16T20:11:55.940 に答える
2

「override」の代わりに「new」キーワードを使用し、メソッドから「virtual」キーワードを削除してみてください;)

于 2013-08-16T20:10:27.067 に答える