如何隐藏界面的某些成员

时间:2011-03-12 19:08:31

标签: c# collections icollection

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

但我不想透露一些ICollection类似Clear方法的成员。

如何实现这一目标?

7 个答案:

答案 0 :(得分:18)

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

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

用户无法直接致电urClassInstance.Clear(),但他们可以像这样间接致电((ICollection)urClassInstance).Clear()

答案 1 :(得分:2)

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

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

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

public interface IGuess
{
    void Guess();
}

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

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

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

是什么让您确信您确实需要实施ICollection?如果您不想使用此接口中的某些方法,请不要使用它,请使用所需的方法声明新接口。使用ICollection的重点是让其他对象认为他们可以对你的对象做任何与其他任何集合无关的事情。

答案 6 :(得分:0)

我宁愿建议你在这里考虑“继承”的“构成”。

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