2010-06-03 45 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(); 
}