コンパイル エラーがいくつかありますが、例に基づいて修正されたバージョンを次に示します。
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.abc
virtual
virtual
virtual