如何防止继承属性的修改?

时间:2012-10-23 18:28:06

标签: c# wpf inheritance

我在标准的wpf组合框中添加了一些额外的东西。在构造函数中,我设置了两个属性:

public SmartComboBox()
            : base()
        {
            this.IsEditable = true;
            this.IsTextSearchEnabled = false;
            ...
        }

这两个属性继承自System.Windows.Controls.ComboBox。 在构造函数中设置它们之后,如何防止修改这两个属性?

4 个答案:

答案 0 :(得分:6)

简短回答:您不能,因为您无法更改属性修饰符。 如果要隐藏实现,只需在类中封装 ComboBox类。

public class SmartComboBox {

     private ComboBox _uiCombo = ....
}

还有另外一件事:

在您的示例中,在显示的代码中,没有任何理由在base()上明确调用ctor,因为它将由CLR

调用

答案 1 :(得分:1)

你不能完全阻止它,你可以来的最接近的是将属性重新声明为新的

public SmartComboBox()
{
    base.IsEditable = true;
    base.IsTextSearchEnabled = false;
    ...
}

public new bool IsEditable { get { return base.IsEditable; } }
public new bool IsTextSearchEnabled { get { return base.IsTextSearchEnabled; } }

这样做的缺点是new不是覆盖,如果对象被转换为其父对象,则可以设置属性。

另一种选择是将该类包装为Tigran所提到的,但是这个pita暴露了你需要的所有其他属性。

答案 2 :(得分:1)

如果您覆盖IsEditableProperty的元数据并使用PropertyChangedCallBack和CorceValueCallBack,该怎么办? http://msdn.microsoft.com/en-us/library/ms597491.aspx

答案 3 :(得分:0)

如果将IsEditable标记为虚拟,则执行

应该是微不足道的
bool iseditableSet=false;
override bool IsEditable
{
    get;
    set
    {
      if(!iseditableSet){
        iseditableSet=true;
        base.IsEditable=value;
      }else{
        throw Exception...
    }     
}

如果它没有被标记为虚拟,那就更难了,但是你可以使用“隐藏”来防止至少你自己的代码在没有明确的base.指令的情况下修改属性。当然,这在物理上是不可能的但是,如果你正在处理一个带Combobox的函数,它可能会修改这些属性。只需把它作为一个教训,为什么属性应该几乎总是虚拟的