C#:派生クラスで異なる戻り値の型を持つプロパティ

私はこの問題の答えを探し出そうとしましたが、それを正しく探す方法がわからないので、ほとんど見つけられませんでした。すべての助けは非常に感謝しています。

ベースクラスは次のようになります

abstract public class Property
{
    private String name;

    public Property(String propertyName)
    { 
        name = propertyName; 
    }

    public String Name
    {
        get { return name; }
    }

    abstract public override String ToString();
}

そして、似たような派生クラス

public class StringProperty : Property
{
    private String value;//different properties for different types

    public StringProperty(String propertyName, String value) : base(propertyName)
    {
        this.value = value;
    }

    public String Value//different signature for different properties
    {
        get { return value; }
    }

    public override String ToString()
    {
        return base.Name + ": " + value;
    }
}

実行時に、関数は “Property”オブジェクトの集合を受け取ります。それぞれの
“価値”を得るためには、私は何をする必要がありますか?各 “Property”オブジェクトのタイプを照会するために大きな
if ステートメントが必要ですか?そうでない場合、より洗練されたソリューションがありますか?

抽象的な
“Value”プロパティをオーバーライドするように定義しようとしましたが、戻り値の型が異なるため動作しませんでした。私は
“Value”プロパティをシャドーイングして試してみましたが、動作させることができませんでした。
COMのようなVariantを使用するという考えは、あまり適切ではないと思います。

ありがとうございます。

編集:

私は何をしようとしているのかについての詳細を加えておくべきだった。プロパティは、Winformsアプリケーションに表示されます。異なる
“TextBox”は異なるプロパティを表し、適切な入力のためにフィルタリングされます(タイプによって異なります)。更新された値は読み出されて保存されます。コンテナオブジェクトはJSONにシリアル化され、AndroidおよびiPhoneクライアントでデシリアライズされ、最終的にはこれらの値がOpenGLの処理を行うネイティブC
++コードを実行するレイヤーに渡されます。私はすべての必要なプロパティの種類を事前に知っていないので、仲介人として、OpenGLエンジンにフィードできるようにしながらコードをできるだけ堅牢にしたいと考えました。

ベストアンサー

ジェネリッククラスを使用することができます:

public class AnyProperty : Property
{
    private T value;
   //... etc

私は本当にベースクラスを今インターフェイスで作ることをお勧めします:

public interface IProperty
{
    public String Name { get; }
}

public class Property : IProperty
{
    public Property(String name, T value)
    {
        Name = name;
        Value = value;
    }

    public String Name { get; private set; }
    public T Value { get; private set; }

    public override String ToString()
    {
        return string.Format("{0}: {1}", Name, Value)
    }
}

使用例は次のとおりです。

var intProp = new Property       ("age", 32);    
var strProp = new Property    ("name", "Earl");    
var enumProp = new Property ("eye color", ColorEnum.Magenta);    

構築をさらに簡単にするには、ファクトリメソッドを使用できます。

public static Property MakeProperty(string name, T value)
{
    return new Property(name,value);
}

var intProp = MakeProperty("age", 32);    
var strProp = MakeProperty("name", "Earl");    
var enumProp = MakeProperty("eye color", ColorEnum.Magenta);    

Not necessarily recommended, and a bit OT:

あなたは拡張メソッドでそれをもっと楽しくすることもできます:

public static Property AsProp(this T value, string name)
{
    return new Property(name,value);
}

var intProp = 32.AsProp("age");
var strProp = "Earl".AsProp("name");
var enumProp = ColorEnum.Magenta.AsProp("eye color");

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です