1

我有一个名为 WizardViewModelBase 的抽象类。

我所有的 WizardXXXViewModel 类都继承自基本抽象类。

底座有一个带有吸气剂的属性。每个子类都需要并覆盖该字符串

属性作为 ViewModel 的 DisplayName。

只有一个名为 WizardTimeTableWeekViewModel 的 ViewModel 需要一个设置器,因为我必须设置

ViewModel 是 A 周还是 B 周的时间表。使用 2 个 ViewModel,例如

WizardTimeTableWeekAViewModel 和 WizardTimeTableWeekBViewModel 将是多余的。

我不想覆盖所有其他类中的设置器,因为它们不需要设置器。

我可以以某种方式告诉子类它不需要覆盖设置器吗?

或者有什么其他建议?

有了接口,我可以自由使用 getter 或 setter,但有很多空的 setter

属性不是我的选择。

有趣..我刚刚想到如果我真的需要设置 WizardPages 的所有 DisplayNames 与我首先说的相反,会发生什么。也许我不应该因为本地化而对 getter 中的字符串进行硬编码并将字符串放在资源文件中,然后我需要在每个子类中的任何地方都有一个 setter XD

4

4 回答 4

1

不要将 setter 方法声明为虚拟的。

如果由于某种原因(我想不出一个!)您需要它在继承层次结构的顶部是虚拟的,那么在覆盖它时使用密封:

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

于 2010-06-03T11:24:02.920 回答
0

您应该引入一个新的抽象类,该类将包含在 WizardViewModelBase 类中。该类应该使用 get 和 set 访问器覆盖一个属性,但会留下一个属性抽象,如下所示:

    public abstract string DisplayName 
    {
        get;
        set;
    }

然后,您可以将此类用作 WizardTimeTableWeekViewModel 类的基类,并且您将能够覆盖 get 和 set 访问器。

于 2010-06-03T11:47:17.730 回答
0

如果属性不是抽象的,那么任何基类都可以选择只覆盖 setter、getter 或两者。

如果您希望您的子类不能访问您的 setter,除了给定的子类,您可以仅对 getter 使用内部访问修饰符,并实现不应访问另一个程序集中的 setter 的类。

于 2010-06-03T11:32:14.880 回答
0

我会使用受保护的设置器并创建一个单独的函数来设置值。毕竟该类与其他类没有相同的接口,因此将其与其他类明显区分开应该有助于提高可读性。

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();
}
于 2010-06-03T11:51:53.930 回答