1

明示的インターフェイスを使用して、次のように実装クラスのメソッドを非表示にできます。

interface IInterface
{
    void f1();

}
public class C1 : IInterface
{
    void IInterface.f1()
    {
        Console.WriteLine(" Method Called ....");
    }

}

次に、メソッドにアクセスできます。

C1 C = new C1();
IInterface i = C;
i.f1();

メソッドf1は実装クラスから隠されC1ます。この種の機能の目的は何ですか? 私たちが同じことを必要とする実際のシナリオを誰かに教えてもらえますか?

4

4 に答える 4

1

パブリック API で何かを直接形式で公開したくない場合があります。うまくいかないかもしれません。パブリック API は、同じ機能のより適切な署名を公開できる可能性があります。例えば:

public int Add(Foo foo) {...} // takes a known type and returns the new index
void ICollection.Add(object obj) {...} // takes object and returns void

より一般的な例は、たとえば、それぞれがメソッドを持ち、同じ入力ではなく、異なる戻り値を返すことが不可能な場合です。C# では戻り値によるオーバーロードが許可されていないため、少なくとも 2 つのメソッドが必要です。IEnumerableIEnumerable<T>GetEnumerator()

IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }

public IEnumerator<T> GetEnumerator() { ...}

ただし、両方とも明示的に指定することもできます。または実際に、でIEnumerator<T>

public T Current { get { ... } }
object IEnumerator.Current { get { return Current; } }

さらに、物の名前を変更したい場合もあります。たとえば、何らかの理由で aFrobberには、当然のことながら であるメソッドがありFrob()ます。しかし、メソッドIDoSomethingを持つインターフェースも実装しています。DoIt()意図を表現するのに最も適切な用語を API に反映させることができるようになりました。

class Frobber : IDoSomething {
  public void Frob() {..}
  void IDoSomething.DoIt() { Frob(); }
}
于 2013-02-11T13:31:49.560 に答える
1

これはMSDNの良い例です。なぜそれらが役立つのかを理解するのに役立ちました:

この例では、ボックスの寸法をメートル単位と英国単位の両方で表示します。Box クラスは、異なる測定システムを表す 2 つのインターフェイス IEnglishDimensions と IMetricDimensions を継承します。どちらのインターフェイスも同じメンバー名、Length と Width を持っています。

// explicit2.cs
// Declare the English units interface:
interface IEnglishDimensions 
{
   float Length();
   float Width();
}
// Declare the metric units interface:
interface IMetricDimensions 
{
   float Length();
   float Width();
}
// Declare the "Box" class that implements the two interfaces:
// IEnglishDimensions and IMetricDimensions:
class Box : IEnglishDimensions, IMetricDimensions 
{
   float lengthInches;
   float widthInches;
   public Box(float length, float width) 
   {
      lengthInches = length;
      widthInches = width;
   }
// Explicitly implement the members of IEnglishDimensions:
   float IEnglishDimensions.Length() 
   {
      return lengthInches;
   }
   float IEnglishDimensions.Width() 
   {
      return widthInches;      
   }
// Explicitly implement the members of IMetricDimensions:
   float IMetricDimensions.Length() 
   {
      return lengthInches * 2.54f;
   }
   float IMetricDimensions.Width() 
   {
      return widthInches * 2.54f;
   }
   public static void Main() 
   {
      // Declare a class instance "myBox":
      Box myBox = new Box(30.0f, 20.0f);
      // Declare an instance of the English units interface:
      IEnglishDimensions eDimensions = (IEnglishDimensions) myBox;
      // Declare an instance of the metric units interface:
      IMetricDimensions mDimensions = (IMetricDimensions) myBox;
      // Print dimensions in English units:
      System.Console.WriteLine("Length(in): {0}", eDimensions.Length());
      System.Console.WriteLine("Width (in): {0}", eDimensions.Width());
      // Print dimensions in metric units:
      System.Console.WriteLine("Length(cm): {0}", mDimensions.Length());
      System.Console.WriteLine("Width (cm): {0}", mDimensions.Width());
   }
}
于 2013-02-11T13:29:12.150 に答える
0

ここで、暗黙的インターフェースと明示的インターフェースの違いを確認できます。

C# インターフェイス。暗黙的な実装と明示的な実装

于 2013-02-11T13:30:09.853 に答える
0

実際のシナリオの 1 つは、メソッド名の衝突です。想像:

interface IWarehouseItem
{
    string Name {get;} // the NAME of the PRODUCT
    int Count {get;}
    int PricePerUnit {get;}
}

interface IWarehouseSupplierInformation
{
    string Name {get;} // the NAME of the SUPPLIER
    int ID {get;}
    int IDAddress {get;}
}

class PurchaseableItem : Entity, IWarehouseItem, IWarehouseSupplierInformation
{
    ....
    // how to implement those different names?
     ....
    string IWarehouseItem.Name { get { this.Product.Name; } }
    ...
    string IWarehouseSupplierInformation.Name { get { this.Supplier.Name; } }
}

この例はインターフェイスとデータ構造の設計が悪いだけだと主張する人もいるかもしれませんが、必ずしもそれらを適切なものにしたり、変更する権限を持っているとは限りません。

また、クラスに何らかのインターフェースを実装することを余儀なくされることもありますが、それらのメソッドがクラスのユーザーに表示されるのは本当に望ましくありません。すべての明示的な実装は private と見なされます。したがって、オブジェクトをその問題のあるインターフェイスに明示的にキャストしない限り、誰もそれらのメソッドを表示したり使用したりできません。

于 2013-02-11T13:33:16.973 に答える