时间:2011-06-16 16:09:47

标签: c# method-hiding

我派生的基类(黑盒子;不能修改它)。在我的派生类中,我不再希望允许用户使用属性,而是现在使用公共函数来代替。我不会详细说明为什么(这是无关紧要的),但这里是我试图隐藏的属性:

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." );
        }
    }

3 个答案:

答案 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(); }
}