web-dev-qa-db-ja.com

「継承されたメンバーを非表示にします。現在のメンバーにその実装をオーバーライドさせるには...」という警告に注意しないとどうなりますか?

これはおそらく良い点ですが、次のようなことをするとコンパイラが発行する警告に関係します。

class A
{
    public virtual void F() { }
}
class B : A
{
    public void F() { }
}

次に、警告が表示されます。

'EomApp1.B.F()' hides inherited member 'EomApp1.A.F()'.
To make the current member override that implementation, add the override keyword. Otherwise use the new keyword.

image of error message

質問:何もしなかった場合に実際に発生する警告は何ですか? 'new'キーワードを追加した場合と追加しない場合のプログラムの機能は異なりますか?

(注:私はこれを十分に簡単にテストできることを知っていますが、ここで質問する価値があると考えました)

30
Aaron Anodide

それは何もしませんが、そこにあるメソッドF()も多態的ではありません。基本クラス参照の使用を開始した場合、警告が表示され、コードを間違えることが非常に簡単になります。もちろん、それはあなたが望むものにすることができます、したがって、新しいキーワードはそれをより明示的にするだけです

例えば。

B b1 = new B();
b1.F(); // will call B.F()

A b2 = new B();
b2.F(); // will call A.F()

ここで、クラスCnewとともに追加すると、Bと同じように動作します。クラスDoverrideとともに追加すると、Fはポリモーフィックになります。

class C : A
{
    public new void F() { }
}

class D : A
{
    public override void F() { }
}

// Later

C c1 = new C();
c1.F(); // will call C.F()

A c2 = new C();
c2.F(); // will call A.F()

D d1 = new D();
d1.F(); // will call D.F()

A d2 = new D();
d2.F(); // will call D.F()

this fiddle を参照してください。

21
Fadrian Sudaman

いいえ、警告が表示されるかどうかを除いて、デフォルトの動作はnewを使用する場合とまったく同じです。私の経験では、より頻繁に実際には、overrideの代わりにnewを指定する必要があります。これは、通常、明示的にオーバーライドするのを忘れているためです。

本当にdoで完全に別の方法が必要で、代わりに別の名前を使用するoptionがある場合は、そのアプローチを採用します。あるメソッドが別のメソッドを隠す通常は、読みやすさが大幅に低下しますIMO。目的がより具体的な戻り値の型を提供することである場合(そして、より弱い型付けのメソッドが同じ値を返すことを確認する場合)はtooではありませんが、それはかなりまれなケースです。

25
Jon Skeet
3
FIre Panda

これは単なる警告です。コードは機能します。状況によっては、この警告が何らかの問題を引き起こす可能性があります。

基本クラスから呼び出すメソッドでnewキーワードを使用します。

class A
{
    public virtual void F() { }
}
class B : A
{
   new public void F() { }
}

参照

https://msdn.Microsoft.com/en-us/library/435f1dw2.aspx

https://msdn.Microsoft.com/en-us/library/aa691135(v = vs.71).aspx

0