我有一个名为WizardViewModelBase的抽象类。
我的所有WizardXXXViewModel类都继承自基本抽象类。
基地有一个带吸气剂的属性。每个子类都需要并覆盖该字符串
属性作为ViewModel的DisplayName。
只有一个名为WizardTimeTableWeekViewModel的ViewModel需要一个setter,因为我必须设置
ViewModel是A周或B周的时间表。使用2个ViewModel
WizardTimeTableWeekAViewModel和WizardTimeTableWeekBViewModel将是多余的。
我不想覆盖所有其他类中的setter,因为它们不需要setter。
我可以以某种方式告诉子类它不需要覆盖setter吗?
还是其他任何建议?
使用接口我可以自由使用getter或setter但有许多空的setter
属性不适合我。
搞笑..我刚想到如果我真的需要设置WizardPages的所有DisplayNames会发生什么,这与我先说的相反。也许我不应该对getter中的字符串进行硬编码并将字符串放在reesource文件中因为本地化,然后我需要在每个子类XD中的任何地方设置一个setter
答案 0 :(得分:1)
不要将setter方法声明为虚拟。
如果由于某种原因(我想不到一个!),你需要在继承层次结构的顶部虚拟它,然后在覆盖它时使用密封:
http://msdn.microsoft.com/en-us/library/aa645769(VS.71).aspx
答案 1 :(得分:0)
如果属性不是抽象的,那么任何基类都可以选择仅覆盖setter,getter或两者。
如果您希望子类不能访问您的setter,除了只有给定的子类,您只能将内部访问修饰符用于getter,并实现不能访问另一个程序集中的setter的类
答案 2 :(得分:0)
您应该引入一个新的抽象类,其中将包含WizardViewModelBase类。该类应使用get和set访问器覆盖属性,但会留下属性abstract,如下所示:
public abstract string DisplayName
{
get;
set;
}
然后,您可以将此类用作WizardTimeTableWeekViewModel类的基类,并且您将能够覆盖get和set访问器。
答案 3 :(得分: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();
}