2

私は C# の初心者で、インターフェイスの拡張メソッドを実装する方法を理解するのに問題があります。この問題に関する資料は見つかりませんでした。C# の一般的な拡張メソッドについて見つけた資料から、次の簡単なデモ例の作業を期待していました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace testExtension
{
public  interface  IcheckThingsOut
{
   bool x();
}
public static class extensionInterface
{
   public static bool y(this IcheckThingsOut bla) { return true;}
}
public class implementInteface : IcheckThingsOut
{
   bool IcheckThingsOut.x()
   {
       return true;
   }
   bool IcheckThingsOut.y()
   {
       return false;

   }
}
}

しかし、コンパイラはまだ満足していません。私は何を見逃していましたか、そしてここで正しい構文は何ですか (コードと同じセマンティクスで)?

4

5 に答える 5

3

拡張メソッドとインターフェースの概念を台無しにしました。拡張メソッドは、静的クラスで静的メソッドを呼び出すためのコンパイラの便利な方法です。インターフェイスを拡張しません。拡張メソッドを使用するときにコンパイラが行うことは次のとおりです。

  IcheckThingsOut instance = new IcheckThingsOutImpl();
  instance.y();

...に変換されます:

  IcheckThingsOut instance = new IcheckThingsOutImpl();
  extensionInterface(instance, y);

ご覧のとおり、yはインターフェースのメソッドではありません。これが、実装で明示的に実装できない理由です。

于 2012-06-14T18:17:24.063 に答える
3

あなたが使用しようとしているように見えるのは「拡張メソッド」です。この目的extensionInterfaceのために、クラスは適切に実装されています。

ただし、拡張メソッドを作成しても実際にはインターフェイスが拡張されないため、を呼び出すことはできますが、暗黙的または明示的にmyIcheckThingsOut.y()実装するクラスでメソッドを再実装することはできません。IcheckThingsOut

于 2012-06-14T18:17:27.697 に答える
2

「extended」クラスまたはインターフェース内の拡張メソッドの実装を変更することはできません。拡張メソッドは実装です。

拡張メソッドは、メソッドをインターフェースまたはクラスに「追加」する方法を提供します。全体的な考え方は、拡張しているインターフェースまたはクラスがこれらのメソッドについて「認識」していないということです。つまり、クラスやインターフェイス自体を変更せずに機能を「追加」します。

(この表記は、インターフェイスにメソッドを追加していることを示していますが、実際には、ランタイムに関する限り、これらのメソッドは単純な静的メソッドであることに注意してください)。

于 2012-06-14T18:15:53.390 に答える
1
bool IcheckThingsOut.y()
{
    return false;

}

間違っています:IcheckThingsOutは関数のプロトタイプを提供していませんy。それはただあるべきです

bool y()
{
    return false;
}

他の方法をシャドウイングしているだけなので

于 2012-06-14T18:17:15.480 に答える
0

IcheckThingsOutにはbooly()がありません

于 2012-06-14T18:15:53.737 に答える