我正在浏览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; (它仍然压倒一切吗?)
答案 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.Add
,IList.Remove
等的方式。但是,如果将其强制转换为{{1},则可以调用它}类型。但在这种情况下,你最终会得到一个例外。
通过显式实现实现的成员不能通过类实例(甚至在类中)可见。您需要通过接口实例访问它。
IList
答案 1 :(得分:3)
那是什么叫Explicit Interface Implementation
。它仅用于在指定接口的实例上公开属性。
如果声明的变量恰好是ICollection类型,则上面提供的示例只会公开Count属性
这是一个很好的用例,想想一个二十一点游戏,玩家和经销商都将获得两张牌。
经销商只会显示他手中的一张牌,而你能够看到你的两张牌,所以我们的牌需要一种不同的行为,这取决于客户指定的界面。
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; } }
}