サブクラスで値(Value
)をオーバーライドする必要があるベースクラス(下の例ではMyBase
)を使用している場合、これを実装する方法がありますか?私はそれを行ういくつかの方法を考えることができますが、なぜ私が別のものを選択するのかについての感触はあまりありません。私はいくつかの例を持っています(C#では、どんなOO言語でもあります)。OOプログラミングスタイル - 仮想プロパティ、コンストラクタパラメータ、または保護されたセッタ
基本クラスの具体的なプロパティ - サブクラスは必要に応じてこの値を設定できます。
public class MyBase
{
protected string Value { get; set; }
protected MyBase()
{
Value = "Default Value";
}
private DoSomethingWithValue()
{
Console.WriteLine(Value);
}
}
public class MySub : MyBase
{
public MySub()
{
Value = "Overridden Value";
}
}
仮想プロパティ - 彼らが望むなら、サブクラスでこのメソッドをオーバーライドすることができます。
public class MyBase
{
protected virtual string Value { get { return "Default Value"; } }
protected MyBase()
{
}
private DoSomethingWithValue()
{
Console.WriteLine(Value);
}
}
public class MySub : MyBase
{
protected override string Value { get { return "Overridden Value"; } }
public MySub()
{
}
}
プロパティは、基本クラスのコンストラクタに設定 - サブクラスは、値を提供することができます。
public class MyBase
{
protected string Value { get; private set; }
protected MyBase(string value)
{
Value = value;
}
protected MyBase() : this("Default Value")
{
}
private DoSomethingWithValue()
{
Console.WriteLine(Value);
}
}
public class MySub : MyBase
{
public MySub() : base("Overridden Value")
{
}
}
明らかに、これらの値の一部は値を変更したり動的に計算したりすることができます。しかし、コンパイル時にその値がわかっている状況では、どちらの方法が望ましいのですか?その理由は何ですか?
+1最も簡単な解決策を使用してください – Nobody
私はあなたの答えに従うとは思わない - 「実行時には保存しない」と言って、基本クラスに具体的なプロパティが必要だと言う。 (コンストラクタまたは基本クラスのコンストラクタでそれを割り当てます)。 –