コンパイル エラーがいくつかありますが、例に基づいて修正されたバージョンを次に示します。
class Base {
public int abc = 3;
}
class Derived : Base {
public int abc = 2;
}
static void Main(string[] args)
{
Derived foo = new Derived();
Console.WriteLine(foo.abc);
Base bar = new Derived();
Console.WriteLine(bar.abc);
}
最初の行は を出力し2ます。2行目はaを出力し3ます。その理由は、基本クラスのメンバーを明示的にオーバーライドしない限り、具象クラスのインスタンスにのみ適用されるためです。
派生クラスでは、明示的に使用せずにnew修飾子キーワードを本質的に使用しています。newキーワードは基本メンバーを隠しますが、具象クラスがその基本型としてキャストされている場合、新しいプロパティは使用されず、具象クラスに再び「キャストダウン」されるまでアクセスできません。
2 番目の例では、Derivedクラスは としてキャストされるBaseため、プロパティが使用されBase abcます。overrideキーワードを使用すると、2 行目でも2.
編集:overrideクラスでの使用を許可するには、キーワードDerivedでマークする必要があることに注意してください。また、フィールドを作成することはできません。キーワードを使用するには、プロパティを使用する必要があります。ただし、最初からフィールドを公開するべきではないため、通常、これは問題になりません。Base.abcvirtual virtualvirtual