C# - 当每个继承的类需要从基类获取getter时,我该怎么办,但是setter只能用于一个继承的类

时间:2010-06-03 11:20:34

标签: c# class abstract setter getter

我有一个名为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

4 个答案:

答案 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();
}