我想创建一个自定义集合来实现ICollection
.
但我不想暴露一些ICollection
类似Clear
方法的成员。
如何做到这一点?
您可以显式实现接口并隐藏实现:
public class UrClass : ICollection
{
void ICollection.Clear() { ... }
}
用户不能urClassInstance.Clear()
直接调用,但可以((ICollection)urClassInstance).Clear()
像这样间接调用。
我宁愿建议您在这里考虑“组合”而不是“继承”。
这使您可以更好地控制要向外部世界公开的所有内容,并具有与实际集合动态绑定的额外优势。
您可能想查看ReadOnlyCollection。您可以创建一个私有内部类并让它实现ICollection
. 然后创建一个ReadOnlyCollection
通过调用AsReadOnly
该对象返回的方法。或者,如果适合您的设计,则将其子类化。最好将此集合子类化,而不是尝试创建自己的实现。
您可以将其设为空或启动 NotImplementedException
你不能。接口成员始终是公共的……否则,该类将无法实现该接口。这就是接口成员声明中不允许访问修饰符的原因。
有两种方法可以声明满足接口要求的成员:隐式和显式。
隐式地,将使用具有匹配签名的任何公共成员:
public interface IGuess
{
void Guess();
}
public class Guy : IGuess
{
public void Guess() {}
}
这是该类的“普通”成员,将反映在该类型的实例上。
正如@Jaroslav 指出的那样,您还可以明确指定成员满足接口定义:
public class Guy : IGuess
{
void IGuess.Guess() {}
}
在这种情况下,除非实例被强制转换为接口类型,否则成员将不会出现。它仍然是公开的。
If you just want to hide those members from your own collection's interface, you can define them explicitly.
void ICollection.Clear() {
// ...
}
Explicitly defined members are only available if the instance is used through that interface.
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
What makes you so sure that you really need to implement ICollection
? If you don't want some methods from this interface, don't use it, declare a new interface with methods that you want. The whole point of using ICollection
is to make other objects think that they can do with your object whatever they can do with any other collection.