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
还是有意义的,因为它是人们熟悉的界面,人们知道如何使用它。他们就是不能修改它。