如何隐藏界面的某些成员

我想创建一个实现ICollection的自定义集合。

但我不想像Clear方法那样暴露ICollection一些成员。

怎么做到这一点?

您可以显式实现接口并隐藏实现:

 public class UrClass : ICollection { void ICollection.Clear() { ... } } 

用户不能直接调用urClassInstance.Clear() ,但是他们可以像这样间接调用((ICollection)urClassInstance).Clear()

您可以将其设为空或启动NotImplementedException

你不能。 接口成员总是公共的……否则,该类将无法实现接口。 这就是接口成员声明中不允许访问修饰符的原因。

有两种方法可以声明满足接口要求的成员:隐式和显式。

隐含地,将使用具有匹配签名的任何公共成员:

 public interface IGuess { void Guess(); } public class Guy : IGuess { public void Guess() {} } 

这是该类的“普通”成员,并将反映在该类型的实例上。

正如@Jaroslav指出的那样,您还可以明确地将成员指定为满足接口定义:

 public class Guy : IGuess { void IGuess.Guess() {} } 

在这种情况下,除非将实例强制转换为接口类型,否则不会显示该成员。 它仍然是公开的。

您可能想要查看ReadOnlyCollection 。 你可以创建一个私有的内部类,让它实现ICollection 。 然后通过在该对象上调用AsReadOnly一个返回ReadOnlyCollection的方法。 或者只是在适合您的设计时将其子类化。 最好是inheritance此集合,而不是尝试创建自己的实现。

如果您只想隐藏自己集合界面中的成员,可以明确定义它们。

 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 ? 如果您不想使用此接口中的某些方法,请不要使用它,请使用所需的方法声明新接口。 使用ICollection的全部意义在于让其他对象认为他们可以对您的对象做任何事情,无论他们可以对任何其他集合做什么。

我宁愿建议你在这里考虑“inheritance”的“组成”。

这使您可以更好地控制所有暴露给外部世界的东西,并具有与实际集合的动态绑定的附加优势。