[英]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.