0

次のコードスニペットがあります

Class Parent
{
    public override String ToString()
    {
            return "in Parent";
    }

    public virtual void printer()
    {
           Console.write(this.ToString());
    }
}

Class Child : Parent
{
    public override String ToString()
    {
            return "in Derived";
    }

    public override void printer()
    { 
           base.printer();
           Console.write(this.ToString());
    }
}

主に私が持っている

Parent p = new Derived();
p.printer();

出力は "In Derived" として 2 回表示されます。これは、ほとんどのオーバーライドされたメソッドが呼び出されるためです。

しかし、この場合、派生クラスを呼び出すベースの代わりに、ベースクラスの ToString() メソッドを呼び出すことは可能ですか?

4

4 に答える 4

1

No. フォーム MSDN:

仮想メソッドが呼び出されると、オブジェクトの実行時の型がオーバーライド メンバーについてチェックされます。どの派生クラスもメンバーをオーバーライドしていない場合は、最も派生したクラスのオーバーライド メンバーが呼び出されます。これは元のメンバーである可能性があります。

したがって、 にキャストしてもParent、オブジェクトは依然として であるChildため、オーバーライドが適用されます。問題は、オーバーライドされた親クラスから呼び出しToString()ているため、インスタンスがChild.

これを回避する 1 つの方法は、を使用する代わりに別のプライベート関数を作成することですToString()

public class Parent
{
    public override String ToString()
    {
        return ToStringPrivate();
    }

    private string ToStringPrivate()
    {
        return "in Parent";
    }

    public virtual void printer()
    {
        Console.WriteLine(this.ToStringPrivate());
    }
}

public class Child : Parent
{
    public override String ToString()
    {
        return "in Derived";
    }

    public override void printer()
    {
        base.printer();
        Console.WriteLine(this.ToString());
    }
}
于 2012-06-07T18:10:36.943 に答える
1

Child クラスで ToString() をオーバーライドするのではなく、 newキーワードを使用することで、これを回避できます。

次に、オブジェクトがChild(またはの子Child) として参照されると、ToString() は にマップされChild.ToString()ます。基本オブジェクト ( などParent) としてキャストされると、ToString() は にマップされParent.ToString()ます。

特に ToString() 関数では、これが必ずしも良い習慣だとは思いません。

于 2012-06-07T18:04:58.960 に答える
0

元の質問コードで解決策に触れたと思います。base.ToString() を直接呼び出すだけです。base.printer() 呼び出しはまだ this.ToString() を呼び出しており、これは Child クラスからオーバーライドされたバージョンを呼び出します。

于 2012-06-07T18:05:23.613 に答える
0

Child に新しいメソッドを追加する必要があります。

public override string BaseToString()
{
     return base.ToString();
}
于 2012-06-07T17:57:44.500 に答える