0

以下の例では、何が起こるでしょうか?

class Base {
    public int abc = 3;
}

Class Derived : Base {
    public int abc = 2;
}

static void Main() {
   Derived blah = new Derived();
   Console.WriteLine(blah.abc);
}

コンソールに「2」が表示されると確信していますが、私が読んでいるもの(および見ているもの)はそれとは反対です...

「2」ではなく「3」と表示されるのはなぜですか? 派生クラスのメンバーは、基本クラスの同じメンバーを「隠した」と思いました...

4

3 に答える 3

10

コンパイル エラーがいくつかありますが、例に基づいて修正されたバージョンを次に示します。

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

于 2010-01-06T20:28:00.500 に答える
0

コード内の明白で多数のエラーを無視します:O、「コンソールに '2' が表示されるはずだ」というあなたの主張は正しいです。

あなたは本当に使うべきです

class Derived : Base {
    public new int abc = 2;
}

継承された値を非表示にすることが意図されている場合

于 2010-01-06T20:23:12.687 に答える
0

もちろん、2が表示されます。なぜ 3 が見られると思ったのですか?

ただし、次の警告が表示されます。

「Derived.abc」は、継承されたメンバー「Base.abc」を非表示にします。非表示が意図されている場合は、new キーワードを使用します。

したがって、次のようにして解決できます。

class Derived : Base {
    public new int abc = 2;
}
于 2010-01-06T20:27:27.967 に答える