3

私の人生では、すべてのドキュメントにもかかわらず、「メソッドの隠蔽」を理解したことがありません。

オーバーライドとは、派生クラスで実装を使用することを意味します。(「new」キーワードを使用して) 非表示にすることは、基本クラスの定義が使用されることを意味すると考えるのは正しいですか? その場合、なぜ継承されたクラスにメソッドを記述するのでしょうか??

実際、私の2つの質問は次のとおりです。

  1. 隠すことは上書きすることの反対ですか?
  2. 新しいキーワード (非表示用) は何をしますか? また、いつ/どこで使用されますか? ベースクラス?継承クラス?
  3. 実用的な実例はありますか?
4

1 に答える 1

15

あなたの理解は少しずれています。

まず、メソッドをオーバーライドするということは、インスタンスがその基本型としてキャストされている場合でも、仮想メソッド テーブルに適切なエントリがあるため、新しい実装が使用されることを意味します。

メソッドを非表示にする場合、インスタンスがその基本型としてキャストされると、仮想メソッド テーブルにエントリがないため、基本実装が使用されます。

次のクラス定義があるとします。

public class Base
{
    public virtual void Say()
    {
        Console.WriteLine("Hello World!");
    }
}

public class A : Base
{
    public new void Say()
    {
        Console.WriteLine("42");
    }
}

public class B : Base
{
    public override void Say()
    {
        Console.WriteLine("Goodbye, Cruel World!");
    }
}

次のコードは次のようになります。

var a = new A();
var b = new B();
var aAsBase = a as Base;
var bAsBase = b as Base;

a.Say(); // 42
aAsBase.Say(); // Hello World!

b.Say(); // Goodbye, Cruel World!
bAsBase.Say(); // Goodbye, CruelWorld!
于 2012-11-01T21:37:15.870 に答える