我派生的基类(黑盒子;不能修改它)。在我的派生类中,我不再希望允许用户使用属性,而是现在使用公共函数来代替。我不会详细说明为什么(这是无关紧要的),但这里是我试图隐藏的属性:
public ComboBoxItemCollection Items { get; }
我试过这个,但它不起作用:
private new ComboBoxItemCollection Items { get; set; }
我也尝试了这个,但编译器说我不允许将两个访问者设为私有:
public new ComboBoxItemCollection Items { private get; private set; }
如何正确完成此操作?请注意,我并不依赖于这是一个完整的安全解决方案,显然通过强制转换到基类,他们仍然可以调用此属性。这只是为用户提供编译时错误,这有助于指导他们意识到他们不能使用此属性,而应该在派生类中使用新函数。
感谢这个帖子中的答案,我提出了以下解决方案:
[Obsolete( "This property is obsolete. Please use MRUIdComboBox.AddItem() instead.", true )]
public new ComboBoxItemCollection Items
{
get
{
throw new NotSupportedException( "This property is not supported. Please use MRUIdComboBox.AddItem() instead." );
}
}
答案 0 :(得分:3)
你做不到。你最接近的将是:
[Obsolete(IsError=true)]
public new ComboBoxItemCollection Items
{
get { return base.Items; } // Or throw an exception
}
就我个人而言,如果你不想要所有的成员,我会想要问你是否应该真的从中得出......你能不能使用作文?
答案 1 :(得分:2)
即使有可能,你也不想“隐藏”访问者(正如你所指出的那样,它们只能通过基类访问)。您发出警告/错误后说“此方法已弃用,应予以避免”。因此,您可能希望查看Obsolete attribute,记录为“属性过时用于标记不应再使用的类型和类型成员” - 正是您的用例。
编辑:我强烈建议不要在访问者中抛出异常。这将违反通常所说的“Liskov替换原则” - 您可以在需要基类的任何地方使用派生类。实际上,这只是一种奇特的语言,即您可能会将派生实例传递到的现有代码期望.Items
获取器以合理的方式运行,而不是在接触时爆炸。如果你抛出一个异常,你很难在非常难以到达的地方调试错误(假设你的超类是一个黑盒子)。
答案 2 :(得分:1)
您可以在子类中将属性设置为public,如果访问它则抛出Exception。您必须确保只访问子类中的基类属性。
public new ComboBoxItemCollection Items
{
get { throw new InvalidOperationException(); }
}