17

記録のために、私はすでにこの接続アイテムを見ましたが、これをサポートする上で何が問題になるのか本当に理解できません。

次のコードがあるとします。

public interface IInterface
{
    void Method();
}

public class Base : IInterface
{
    virtual void IInterface.Method()
    {
        throw new NotImplementedException();
    }
}

仮想識別子の問題は何ですか?仮想モディファイアがあるとoverride、基本クラスに別の実装があることを示すことができます。仮想メソッドを削除し、次のような派生クラスを作成することで、これを機能させることができます。

public class Derived : IInterface
{
    void IInterface.Method()
    {
        throw new NotImplementedException();
    }
}

ただし、この方法では、何かをオーバーライドしていることをまったく示していません。

更新:
C#(パート:20.4.1明示的なインターフェイスメンバーの実装)仕様によると、2つの理由があります。

  1. 特定のメソッドの非表示(私はそれを使用しています)。
  2. シグニチャは同じでリターンタイプが異なる2つの関数があります(たとえば、IClonableに役立ちます)。

ただし、これらのメソッドを仮想化できない理由については何も述べていません。

Update2:
答えを考えると、ここで本当の質問を言い換えるべきだと思います。上記の2つの理由が、そもそもインターフェースの明示的な実装が可能になった理由である場合。メソッドを仮想化すると、なぜ問題になるのでしょうか。

4

5 に答える 5

16

インターフェイスを明示的に実装するメソッドには、特別な可視性スコープがあります。「this」をターゲットインターフェイスタイプにキャストしない限り、別のメソッドからアクセスすることはできません。仮想指定子がサポートされていない理由はこれだと思います。通常のオブジェクトインターフェイス(プライベート/保護/パブリック)の一部ではないメソッドをオーバーライドすることはできません。

これは私の回避策です:

public class Base : IInterface
{    
   protected virtual void Method()
   {

   }

   void IInterface.Method()    
   {        
       this.Method()
   }
 }


 public class Derived : Base
 {
     protected override void Method()
     {
     }
 }
于 2011-08-17T09:04:47.410 に答える
7

ただし、この方法では、何かをオーバーライドしていることをまったく示していません。

そうですね、そうですね。これは明らかに明示的なインターフェイスの実装であるという事実があります。これは、インターフェイスで指定されたメソッド呼び出しにポリモーフィックな動作を提供していることを示しています...基本クラスインターフェイスを実装したかどうかが重要なのはなぜですか?コードを読んだときに、どのような違いがありますか?

私にとって、述べることの主な利点は、override私が本当に正しい署名を持っていることを確認することです-それは私がオーバーライドしようとしているものと一致することです。存在しないメソッドや間違ったパラメーターなどを指定した場合、コンパイラーはすでに文句を言うように、明示的なインターフェースの実装ですでにその利点を享受しています。

私はあなたの主張をある程度理解することができますが、それが実際の問題であるとは思っていません

于 2011-08-17T08:58:45.057 に答える
0

明示的なインターフェイス実装を仮想化できることは、派生クラスのオーバーライドが親クラスの実装を呼び出す必要がある場合の1つのシナリオでのみ役立ちます。残念ながら、明示的なインターフェイス実装を仮想化できたとしても、オーバーライドするクラスがその親の実装を呼び出す方法はありません。そのための新しい構文がない場合です。VB.netは、インターフェイスを実装するメソッドをProtectedインターフェイスのメソッドとは異なる名前で宣言できるようにすることで、これを適切に処理します。したがって、派生クラスはProtected(適切な名前を使用して)メソッドをオーバーライドでき、そのオーバーライドは(同じ名前を使用して)親クラスバージョンを呼び出すことができます。

于 2012-09-13T23:11:03.253 に答える
-1

継承元のインターフェイスが1つしかない場合、なぜ次のことを行う必要がありますか。

public class Base : IInterface
{
    virtual void IInterface.Method()
    {
       throw new NotImplementedException();
    }
}

行ってみませんか:

public class Base : IInterface
{
   virtual void Method()
   {
      throw new NotImplementedException();
   }
}
于 2011-08-17T08:57:05.427 に答える
-1

その理由は次の例で簡単にわかると思います。このコードを考えてみましょう:

public interface IInterfaceA
{
    void Method();
}

public interface IInterfaceB
{
    void Method();
}

public class Base : IInterfaceA, IInterfaceB
{
    virtual void IInterfaceA.Method()
    {
       ...
    }

    virtual void IInterfaceB.Method()
    {
       ...
    }
}

public class Derived : Base
{
    public override void Method()
    {
        // Will this override IInterfaceA or IInterfaceB implementation???
    }
}

したがって、要するに、同じメソッドシグネチャを使用して複数のインターフェイスを明示的に実装した場合、派生クラスはオーバーライドする基本メソッドを認識しません。

于 2013-04-04T03:22:54.990 に答える