1

MSDNによると:

newキーワードを修飾子として使用すると、基本クラスから継承されたメンバーが明示的に非表示になります。継承されたメンバーを非表示にすると、メンバーの派生バージョンが基本クラスバージョンに置き換わります。新しい修飾子を使用せずにメンバーを非表示にすることはできますが、結果は警告になります。newを使用してメンバーを明示的に非表示にすると、この警告が抑制され、派生バージョンが置換として意図されているという事実が文書化されます。

例:

class Base
{
 int value;

 virtual bool Foo()
 {
   value++;
 }
}

class Derived : Base
{
 int value;

 override bool Foo()
 {
  value++;
 }

}

newDerived.value宣言に修飾子を追加する必要がありますか?何が変わりますか?

4

4 に答える 4

15

valueフィールドはであるためprivate、派生クラスではアクセスできません。したがって、派生クラスの宣言は実際には何も隠しません。new宣言に追加しないでください。その場合、コンパイラが間違った使用について警告することを除いて、何も変わりませんnewvalue派生クラスでフィールドにアクセスできる場合(例: だった場合)、基本メンバーを非表示にする意図を表現するためにpublic使用する必要があります。new

class A {
    public int field;
}
class B : A {
    public int field; // warning. `B.field` hides `A.field`. 
}

を使用newすると、その警告が消えます (それ以外の効果はありません):

class B : A {
    public new int field; // Dear compiler, shut up please.
}

overrideメソッドをとの両方として宣言することはできませんnew。それらは相互に排他的です。

于 2009-12-17T15:35:21.707 に答える
2

あなたの例を考えると、Derived.value は Base.value を「隠している」わけではありません。C# の既定のアクセス修飾子は Private です。Base.value をパブリックにすると、はい、新しい修飾子を使用すると警告が削除されます。

于 2009-12-17T15:40:50.717 に答える
1

new 修飾子は、主に非仮想メソッドを隠すために使用されます。override 修飾子とは異なり、メソッド (つまり、変数とプロパティ) だけでなく、すべてのクラス メンバーを非表示にするために使用されます。

主な目的は、override を使用する代わりにメソッドを非表示にするために使用する場合です (ちなみに、メソッドを非表示にするために、override と new の両方を使用することはできません。これにより、単なる警告ではなくエラーが発生します)。

virtual および override 修飾子の使用は常に new 修飾子の使用と似ていますが、virtual および override を使用する場合は、Child クラス自体の内部以外から Base クラスを呼び出すことはできません。

于 2009-12-17T15:46:12.547 に答える
0

いいえ、そうではありません。この場合、基本メソッドは としてマークされているvirtualため、基本クラスがこのメソッドをオーバーライドすることが意図されています。

修飾子を使用する必要があるnewのは、ベース メソッドが としてマークされていない場合virtualです。次に例を示します。

class Base
{
    int value;

    public void Foo()
    {
        value++;
    }
}

class Derived : Base
{
    int value;

    new public void Foo()
    {
        value--;
    }
}

また、上記の例では、基本メソッドがまたはとしてFooマークされていると想定する必要があります。そうでない場合、修飾子の使用は、基本/他のクラスからは見えないため、とにかく無意味です。publicprotectedvirtual

于 2009-12-17T15:43:34.140 に答える