2010-06-03 91 views
1

我有一個叫做WizardViewModelBase的抽象類。C# - 當每個繼承類需要基類getter,但setter只適用於一個繼承類時,該怎麼辦?

我的所有WizardXXXViewModel類都繼承自基本抽象類。

該基地有一個屬性與吸氣劑。每個子類都需要並覆蓋該字符串

屬性作爲其ViewModel的DisplayName。

只有ONE視圖模型稱爲WizardTimeTableWeekViewModel需要一個二傳手,因爲我必須設置

羯羊視圖模型是本週A或B.每週使用2周的ViewModels像

時間表WizardTimeTableWeekAViewModel和WizardTimeTableWeekBViewModel是多餘的。

我不想在所有其他類中重寫setter,因爲它們不需要setter。

我可以以某種方式告訴子類,它不需要重寫setter嗎?

還是有其他建議?

隨着界面我可以自由使用getter或setter,但有很多空的setter

性質不是我的選擇。

有趣..我剛纔想過會發生什麼,如果我真的需要將WizardPages的所有DisplayNames設置爲與我之前說的相反。也許我不應該在getter中硬編碼字符串,並且由於本地化而將字符串放在reesource文件中,那麼我需要在每個子類中的任何位置使用setter XD

+1

請張貼一些代碼... – Stefan 2010-06-03 11:33:08

回答

1

不要將setter方法聲明爲虛擬。

如果由於某種原因(我想不出一個的!),你需要爲它在你的繼承層次結構的頂端,然後使用密封,當你重寫它的虛擬:

http://msdn.microsoft.com/en-us/library/aa645769(VS.71).aspx

+0

我現在用這樣的: 虛擬繼承屬性可以在派生類中,通過包括使用override修飾符的屬性聲明被覆蓋。 比密封更好=> 基類: 公共虛擬字符串DisplayName {get;組; } 子類: private string _displayName; public override string DisplayName { get {return _displayName; } set {_displayName = value; }} @DAVID 不是一個解決辦法,但你指出我朝着正確的方向在那裏,你 點雲:P – msfanboy 2010-06-03 11:48:57

+0

你說出於某種原因,但你不知道嗎?你的意思是認真回答? ;-) 嘿它的一個字符串屬性displayname不是更多不是100000 LOC應用程序。 我想保持它的實用性。 – msfanboy 2010-06-03 12:30:18

0

如果該屬性不是抽象的,那麼任何基類都可以選擇只覆蓋setter,getter或兩者。

如果你希望你的子類不能訪問你的setter,除了只有給定的子類,你可以只使用內部訪問修飾符給getter,並實現不應該訪問另一個setter的類部件。

0

您應該引入一個新的抽象類,它將嵌入WizardViewModelBase類中。這個類應該使用重載的屬性get和set訪問,但會留下一個屬性的抽象,像這樣:

public abstract string DisplayName 
    { 
     get; 
     set; 
    } 

然後你可以使用這個類作爲WizardTimeTableWeekViewModel類的基類,你西港島線能夠覆蓋獲取和設置訪問器。

+0

只爲屬性介紹anotehr抽象類?來一個... – msfanboy 2010-06-03 12:31:25

0

我會使用受保護的setter並創建一個單獨的函數來設置值。畢竟所有的課程都沒有與其他課程相同的界面,所以將它與其他課程區分開來應該有助於提高可讀性。

class Base 
{ 
    public String Value { get; protected set; } 
} 

class SpecialChild : Base 
{ 
    public void SetValue(String newValue) { this.Value = newValue; } 
} 

// Somewhere else 
SpecialChild special = foo as SpecialChild; 
if (special != null) 
{ 
    special.SetValue('newFoo'); 
} 
else 
{ 
    foo.DoSomeStuff(); 
}