2011-12-03 12 views
5

は、私の質問は、それが上書きされ、上書きされているので、私はオーバーライドまたは仮想キーワードとのHttpConnectionクラスにメソッド近い()を宣言する必要があるかどうかを知ることがあるシナリオC#でオーバーライドされ、同時にオーバーライドされるメソッドについてのコメント?ここ

 public class Connection 
    { 
     public virtual void close() 
     { 
      /*Some code */ 
     } 
    } 

    public interface IHttpRelay 
    { 

     void close(); 

    } 

    public class HttpConnection: Connection,IHttpRelay 
    { 
     public /*keyword*/ void close() 
     { 
      base.close(); 
     } 
    } 

    public class Http:HttpConnection 
    { 
     public override void close() 
     { 
      /*Some code */ 
     } 
    } 

です同時に。

答えて

2

overrideとマークする必要があります。 virtualとマークすると、HttpConnectionになります。を非表示にして、オーバーライドしません。その結果、多形的に使用することはできませんでした。 1つのメソッドをバーチャルにマークし、残りは単にオーバーライドする必要があります。ここで

簡単な例として

class A 
{ 
    public virtual void Frob() 
    { 
     Console.WriteLine("A"); 
    } 
} 

class B : A 
{ 
    public virtual void Frob() 
    { 
     Console.WriteLine("B"); 
    } 
} 

class C : B 
{ 
    public override void Frob() 
    { 
     Console.WriteLine("C"); 
    } 
} 

、Bはそれをオーバーライドしない、仮想FROBを再定義します。あなたの例に従います。しかし、Aの参照によってCのインスタンスで作業する場合、「予期しない」何かが発生します。

A obj = new C(); 
obj.Frob(); // "A" is written to the screen, not "C" 

画面に表示されるものは「A」です。予想通りの多態性は得られませんでした。メンバーをオーバーライドする代わりに非表示にすると、非表示クラスの参照を介してのみ新しい動作が得られます。ベースクラスを介して参照されると、基本動作を受け取ります。これは通常、仮想/オーバーライドポリモフィックシナリオでは望んでいません。 virtualをクラスBのoverrideに置き換えて上記のスニペットを実行すると、出力が期待通りです。

1

overrideのみを宣言する必要があります。あなたがstaticabstractprivate、またはoverride修飾子とvirtual修飾子を使用することはできません

virtual状態のdocumentation誰かは、将来的にあなたのオーバーライドをオーバーライドすると、確かにクラスの作家が戻ってvirtualを追加することができない場合は、あなたが知っていることができない何もない場合:

あなたが考えてみれば、virtual overrideは意味がありません。あなたがそれを上書きすることを決定した後に、メソッドに追加することができます。

+0

あなたが上書きするメソッドは、すでに仮想でなければならないので、言語で 'virtual'修飾子をもう一度追加することができれば混乱します。 – Joren

2

オーバーライド修飾子は、派生クラスが同じメソッドをもう一度オーバーライドするのを防ぎません。これを防ぐには、修飾子sealedも使用してください。

関連する問題