【发布时间】:2012-03-01 18:48:33
【问题描述】:
我创建了一个基类,它具有许多公共属性并且被完美地使用。现在我想使用这个类来派生其他类,但我不希望它的某些属性暴露在继承它的派生类之外。有没有办法使基类的公共属性不能在其派生类之外公开。(要隐藏的属性是公共的,因为它们在继承它的其他类中使用)。任何帮助都将受到高度重视。
【问题讨论】:
我创建了一个基类,它具有许多公共属性并且被完美地使用。现在我想使用这个类来派生其他类,但我不希望它的某些属性暴露在继承它的派生类之外。有没有办法使基类的公共属性不能在其派生类之外公开。(要隐藏的属性是公共的,因为它们在继承它的其他类中使用)。任何帮助都将受到高度重视。
【问题讨论】:
你想让他们protected。
来自 MSDN:
受保护的成员可在其类内和派生类实例中访问。
【讨论】:
我同意 cadrell0 关于将它们标记为受保护的观点,但如果您正在寻找属性实际上是 public 但对某个派生类的用户隐藏的解决方案,您可以使用 explicit interface
interface IHaveMethodsYouCanHide { void Foo(); }
class Base : IHaveMethodsYouCanHide { public void Foo() {} }
class NonHidingDerived : Base { }
class HidingDerived : Base, IHaveMethodsYouCanHide
{
void IHaveMethodsYouCanHide.Foo() {}
}
使用此代码,HidingDerived 类型的标识符将不允许调用 Foo(除非首先转换为 IHaveMethodsYouCanHide)。
【讨论】:
您所要求的根本不可能。如果类型 B 继承自类型 A,那么它“是”类型 A。B 至少具有与类型 A 相同的可访问合同。在不从根本上违反本合同的情况下,没有办法隐藏 A 的公共成员。
如果您发现自己处于想要使用 A 但只公开属性子集的场景中,那么继承不是正确的解决方案:包含是正确的解决方案。
public class B {
private A m_wrapped;
// Expose only the properties you want to expose here
}
【讨论】: