1

WizardViewModelBase という抽象クラスがあります。

私の WizardXXXViewModel クラスはすべて基本抽象クラスから継承しています。

ベースにはゲッターを持つプロパティがあります。すべてのサブクラスはその文字列を必要とし、オーバーライドします

プロパティを ViewModel の DisplayName として使用します。

設定する必要があるため、WizardTimeTableWeekViewModel と呼ばれる 1 つの ViewModel だけがセッターを必要とします。

ViewModel が週 A または週 B のタイムテーブルであるかどうか。次のような 2 つの ViewModel を使用する

WizardTimeTableWeekAViewModel と WizardTimeTableWeekBViewModel は冗長です。

セッターは必要ないため、他のすべてのクラスでセッターをオーバーライドしたくありません。

セッターをオーバーライドする必要がないことをサブクラスに伝えることはできますか?

または他の提案はありますか?

インターフェイスを使用すると、ゲッターまたはセッターを自由に使用できますが、空のセッターが多数あります

プロパティは私にとってオプションではありません。

面白い..私が最初に言ったことに反して、WizardPages のすべての DisplayNames を本当に設定する必要がある場合はどうなるか考えました。おそらく、ローカリゼーションのために getter で文字列をハードコーディングしてリソース ファイルに文字列を配置するべきではなく、すべてのサブクラス XD のどこかに setter が必要です。

4

4 に答える 4

1

セッター メソッドを仮想として宣言しないでください。

なんらかの理由で (思いつきません!) 継承階層の最上位でそれを仮想にする必要がある場合は、オーバーライドするときに seal を使用します。

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

于 2010-06-03T11:24:02.920 に答える
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 に答える
0

WizardViewModelBase クラスに組み込まれる新しい抽象クラスを導入する必要があります。そのクラスは、get アクセサーと set アクセサーの両方を使用してプロパティをオーバーライドする必要がありますが、次のようにプロパティの抽象を残します。

    public abstract string DisplayName 
    {
        get;
        set;
    }

次に、このクラスを WizardTimeTableWeekViewModel クラスの基本クラスとして使用すると、get アクセサーと set アクセサーの両方をオーバーライドできます。

于 2010-06-03T11:47:17.730 に答える
0

プロパティが抽象的でない場合、基本クラスはセッター、ゲッター、またはその両方のみをオーバーライドすることを選択できます。

特定のサブクラスのみを除いて、サブクラスがセッターにアクセスできないようにする場合は、内部アクセス修飾子をゲッターにのみ使用し、別のアセンブリでセッターにアクセスできないクラスを実装できます。

于 2010-06-03T11:32:14.880 に答える