プロパティでさまざまな種類の値を取得できるクラスを作成したいと考えています。ポリモーフィズムを使用してこれを実行しようとしていますが、これを適切に行う方法をまだ学んでいないため、アドバイスを求めています。
基本クラスと、それを継承する 2 つのクラスがあります。
public abstract class BaseClass
{
public string Name { get; set; }
public Unit Unit { get; set; }
}
public class DerivedClassFloat : BaseClass
{
public float Value { get; set; }
public override string ToString()
{
return Value.ToString();
}
}
public class DerivedClassString : BaseClass
{
public string Value { get; set; }
public override string ToString()
{
return Value;
}
}
リストを作成し、さまざまな特殊なサブクラスを追加できます。私の問題は、リスト内の項目の値を変更する必要がある場合に発生します。
foreach (var item in ListOfBaseClasses)
{
if(item is DerivedClassFloat)
((DerivedClassFloat) item).Value = float.NaN;
if (item is DerivedClassString)
((DerivedClassString) item).Value = string.Empty;
}
私が読んだことによると、それはコードの匂いのようです。割り当てようとしている型に基づいて、派生クラスの値プロパティにアクセスするより良い方法はありますか?
値に基づいて適切なサブクラスを作成したい場合はどうでしょうか?
BaseClass newClass = null;
if (phenotype is DerivedClassFloat)
newClass = new DerivedClassFloat(){Value = 12.2};
if (phenotype is DerivedClassString)
newClass = new DerivedClassString(){Value = "Hello"};
仮想メソッドのオーバーライドについて読みましたが、値を追加または変更するのではなく、値を処理したい場合に機能します...何か足りないのでしょうか?
これをもっと具体的にする必要があります。申し訳ありませんが、この素晴らしいサイトに質問を投稿することに慣れていません。
属性のリストで構成されるプロパティが必要です。各属性には名前と値がありますが、値は異なる型にすることができます。例えば:
public class Organism
{
public string Name { get; set; }
public List<Attribute> Attributes { get; set; }
}
public class Attribute
{
public string AttributeName { get; set; }
public object AttributeValue { get; set; }
}
特定の生物に対して、異なる値の型を持ついくつかの属性を持つことができます。正しい型にキャストする必要がないように、オブジェクト型の使用を避けたかったのです。プロパティのポリモーフィズムは、このケースをエレガントに処理するためのソリューションであると考えていましたが、そもそもキャストとあまり変わらないように思われる If ..Then を使用していることに気付きました。