多型/オーバーライド | oop,polymorphism,.net,c#,inheritance

誰かがこの2つの例の違いを説明してください。

クラスA

     

保護された仮想文字列GetData()

     

クラスB

     

プライベートオーバーライド文字列GetData()

また、

クラスA

     

保護された文字列GetData()

     

クラスB

     

プライベート文字列GetData()

「クラスB」は「クラスA」から継承すると仮定します。

メソッドのオーバーライドが必要な場合は、スーパークラスでは virtual を使用し、サブクラスでは
override を使用する必要があると常に考えていましたが、 。もしあれば、違いは何ですか?

ベストアンサー

表示された2番目の例は、親のGetDataを隠していますが、それを上書きしません。

例:

private class Base
{
    public virtual void Test()
    {
        Console.WriteLine("Base");
    }

    public void Test2()
    {
        Console.WriteLine("Base");
    }
}

private class Derived : Base
{
    public override void Test()
    {
        Console.WriteLine("Derived");
    }

    public void Test2()
    {
        Console.WriteLine("Derived");
    }
}

static void Main()
{
    Base b = new Base();
    Derived d = new Derived();
    Base dInB = new Derived();

    b.Test();
    d.Test();
    dInB.Test();

    b.Test2();
    d.Test2();
    dInB.Test2();

    Console.ReadKey(true);
}

それは出力する:

Base   //Base.Test()
Derived//Derived.Test()
Derived//Derived.Test()
Base   //Base.Test2()
Derived//Derived.Test2()
Base   //You think you're calling Derived.Test2(), but you actually call Base.Test2()

実際、このサンプルは無効です。なぜなら、Derivedクラスの public new void
Test2()
new キーワードを使用する必要があるからです。

演算子のオーバーロードと同じように機能します。実際には何も上書きされません。正確な型 Derived
を持つと、新しいメソッドが呼び出されます。

You have to be really careful with hiding members, it is
nothing like overriding (classes) or implementing (interfaces) at
all. Only when you have the

exact type it’ll call a
new method, otherwise it’ll still call the
base type’s method!

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です