簡體   English   中英

如何防止繼承屬性的修改?

[英]How to prevent modification of inherited properties?

我向標准wpf組合框添加了一些額外的內容。 在構造函數中,我設置了兩個屬性:

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

這兩個屬性是從System.Windows.Controls.ComboBox繼承的。 在構造函數中設置這兩個屬性的值后,如何防止對這兩個屬性進行修改?

簡短的答案:您不能,因為屬性修飾符不能由您更改。 如果要隱藏實現,只需 ComboBox封裝在您的類中。

public class SmartComboBox {

     private ComboBox _uiCombo = ....
}

還有另外一件事:

在您的示例中,在給出的代碼中,沒有任何理由在ctor上顯式調用base() ,因為它將由CLR調用

您無法完全阻止它,最接近的是將屬性重新聲明為new

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提到的類,但是帶有它的皮塔餅將公開您需要的所有其他屬性。

如果您覆蓋IsEditableProperty的元數據並使用PropertyChangedCallBack和CorceValueCallBack怎么辦? http://msdn.microsoft.com/en-us/library/ms597491.aspx

如果將IsEditable標記為虛擬,則只需做些簡單的事情

bool iseditableSet=false;
override bool IsEditable
{
    get;
    set
    {
      if(!iseditableSet){
        iseditableSet=true;
        base.IsEditable=value;
      }else{
        throw Exception...
    }     
}

如果未將其標記為虛擬,則難度會更大,但是您可以使用“隱藏”來防止至少您自己的代碼在沒有非常明確的base.情況下修改該屬性base. 當然,盡管如果要處理使用Combobox的函數,並且它可能會修改這些屬性, Combobox物理上講這是不可能的。 只是作為一個教訓,為什么屬性幾乎總是應該是虛擬的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM