C# 如何隐藏接口的某些成员
我想创建一个实现C# 如何隐藏接口的某些成员,c#,collections,icollection,C#,Collections,Icollection,我想创建一个实现ICollection的自定义集合 但是我不想暴露一些ICollection的成员,比如Clear方法 如何做到这一点?你做不到。接口成员始终是公共的。。。否则,该类将无法实现该接口。这就是为什么接口成员声明中不允许使用访问修饰符 声明满足接口要求的成员有两种方式:隐式和显式 void ICollection.Clear() { // ... } 默认情况下,将使用具有匹配签名的任何公共成员: public interface IGuess { void Gue
ICollection
的自定义集合
但是我不想暴露一些ICollection
的成员,比如Clear
方法
如何做到这一点?你做不到。接口成员始终是公共的。。。否则,该类将无法实现该接口。这就是为什么接口成员声明中不允许使用访问修饰符 声明满足接口要求的成员有两种方式:隐式和显式
void ICollection.Clear() {
// ...
}
默认情况下,将使用具有匹配签名的任何公共成员:
public interface IGuess
{
void Guess();
}
public class Guy : IGuess
{
public void Guess() {}
}
这是类的“普通”成员,将反映在类型的实例上
正如@Jaroslav所指出的,您还可以显式地将成员指定为满足接口定义:
public class Guy : IGuess
{
void IGuess.Guess() {}
}
在这种情况下,除非将实例转换为接口类型,否则不会显示成员。它仍然是公开的。您可能想查看一下。您可以创建一个私有的innerclass并让它实现
ICollection
。然后,通过对该对象调用AsReadOnly
,创建一个返回ReadOnlyCollection
的方法。
或者,如果它符合您的设计,就将其子类化。首选对此集合进行子类化,而不是尝试创建自己的实现。您可以将其设为空或启动NotImplementedException您可以显式实现接口并隐藏实现:
public class UrClass : ICollection
{
void ICollection.Clear() { ... }
}
用户不能直接调用
urClassInstance.Clear()
,但他们可以像这样间接调用((ICollection)urClassInstance.Clear()
。如果您只想从自己的集合接口中隐藏这些成员,可以显式定义它们
void ICollection.Clear() {
// ...
}
只有通过该接口使用实例时,显式定义的成员才可用
YourCollection col1 = new YourCollection();
col1.Clear(); // this is not allowed if clear is defined explicitly
ICollection col2 = new YourCollection();
col2.Clear(); // this will work because col2 is ICollection
是什么让您如此确信您真的需要实现
ICollection
?如果你不想从这个接口得到一些方法,不要使用它,用你想要的方法声明一个新的接口。使用<代码> IcLeope<代码>的全部要点是让其他对象认为他们可以处理你的对象,不管他们能用任何其他集合做什么。 < P>我建议你在这里考虑“组成”而不是“继承”。< /P>
这使您能够更好地控制要向外部世界公开的内容,并增加了与实际集合动态绑定的优势。IMO最好的方法是使用这些“隐藏”方法创建另一个接口。为什么不直接使用
ReadOnlyCollection
Dictionary
实现了ICollection
但是IsReadOnly
属性从ICollection
在Dictionary上是不可见的,怎么可能呢?@Mark Lachowski:查看我的答案。谢谢,在此代码中:Dictionary dict=new Dictionary();var ic=((ICollection)dict);为什么我无法访问ic上的IsReadOnly
?它是ICollection@MarkLachowski:使用ICollection dict=new Dictionary()代码>或var ic=((ICollection)dict)
。非泛型的ICollection
没有实现IsReadOnly
属性。这正是ReadOnlyCollection的工作方式。建议将其子类化,而不是创建自己的子类。不过仍然是+1。NotSupportedException
比我想象的更有意义。请看ReadOnlyCollection类:。它实现ICollection
,但使用显式接口实现“隐藏”修改集合的成员。这些方法抛出不支持异常
。尽管如此,实现ICollection
还是有意义的,因为它是人们熟悉的界面,人们知道如何使用它。他们就是不能修改它。