编辑界面时它叫什么?

时间:2014-08-30 17:46:20

标签: c# json interface override ienumerable

我正在浏览LitJSON库。在代码中有很多段,如

 public class JsonData : IJsonWrapper, IEquatable<JsonData>

 #region ICollection Properties
            int ICollection.Count {
                get {
                    return Count;
                }
            }
    #end region

对于我知道覆盖/重载如何工作的方法,但在上面的示例中,代码为:int ICollection.Count

我不熟悉方法签名的格式。编码器是否试图明确声明其ICollection.Count接口?

你能解释一下这是什么&#34;叫做#34; (它仍然压倒一切吗?)

2 个答案:

答案 0 :(得分:12)

它被称为explicit interface implementation。主要用于消除不同接口中同名的成员的歧义,这些接口也需要不同的实现。

考虑你有

interface ISomething1
{
    void DoSomething();
}

interface ISomething2
{
    void DoSomething();
}

class MyClass : ISomething1, ISomething2
{
    void ISomething1.DoSomething()
    {
        //Do something
    }

    void ISomething2.DoSomething()
    {
        //Do something else
    }
}

如果没有显式接口实现,您将无法为我们实现的接口提供DoSomething的不同实现。

如果要实现某个接口,并且希望将其从客户端隐藏(在某种程度上),则可以使用显式实现。 Array类明确实现了IList接口,以及它隐藏IList.AddIList.Remove等的方式。但是,如果将其强制转换为{{1},则可以调用它}类型。但在这种情况下,你最终会得到一个例外。

通过显式实现实现的成员不能通过类实例(甚至在类中)可见。您需要通过接口实例访问它。

IList

答案 1 :(得分:3)

那是什么叫Explicit Interface Implementation。它仅用于在指定接口的实例上公开属性。

如果声明的变量恰好是ICollection类型,则上面提供的示例只会公开Count属性

MSDN


实施例

这是一个很好的用例,想想一个二十一点游戏,玩家和经销商都将获得两张牌。

经销商只会显示他手中的一张牌,而你能够看到你的两张牌,所以我们的牌需要一种不同的行为,这取决于客户指定的界面。

public interface IHand {
    List<Card> CurrentHand { get; }
}

public interface IDealerHand : IHand {
}

public interface IPlayerHand : IHand {
}

public class Hand : IDealerHand, IPlayerHand{

    private List<Card> cardsHeld;

    // The implementation here will ensure that only a single card for the dealer is shown.
    List<Card> IDealerHand.CurrentHand { get { return cardsHeld.Take(1); } }

    // The implementation here will ensure that all cards are exposed.
    List<Card> IPlayerHand.CurrentHand { get { return cardsHeld; } }
}