1

前の質問「オブジェクト モデルの設計における重要なルールは何ですか」に続いて、次の質問をしたいと思います。

クラス インスタンスの動的プロパティを持つ方法はありますか?

この概略オブジェクト モデルがあるとします。

オブジェクト モデル

したがって、各オブジェクトは、実装されたインターフェイスのセットにより多くのプロパティを持ち、比較的重いオブジェクトになる可能性があります。可能なすべての (そしてもちろん妥当な) オブジェクトを作成することは、この問題(つまり、Pipe_Designed と Pipe_Designed_NeedInspection)を解決する方法です。次のダイアログのように、エンド ユーザーが自分の新しいオブジェクトで使用できる機能を選択できるようにする、動的なプロパティを持つ方法があるかどうか疑問に思います。

ダイアログ

4

3 に答える 3

2

あなたが欲しいのはですProperties patternこれに関する Steve Yeggeの長くて退屈だが巧妙な記事をチェックしてください。

于 2009-02-01T10:18:13.407 に答える
1

パブリック プロパティの数を意味する場合は、明示的なインターフェイスの実装を使用します。

フィールド (およびスパース オブジェクトのオブジェクト スペース) を意味する場合: プロパティの実装には常にプロパティ バッグを使用できます。

C# の例:

string IDesigned.ApprovedBy {
    get {return GetValue<string>("ApprovedBy");}
    set {SetValue("ApprovedBy", value);}
}

値の辞書を使用:

readonly Dictionary<string, object> propValues =
    new Dictionary<string, object>();
protected T GetValue<T>(string name)
{
    object val;
    if(!propValues.TryGetValue(name, out val)) return default(T);
    return (T)val;
}
protected void SetValue<T>(string name, T value)
{
    propValues[name] = value;
}

SetValueまた、通知に適した場所でもあることに注意してください。たとえば、 INotifyPropertyChanged.NET でオブザーバー パターンを実装する場合などです。他の多くのアーキテクチャには、似たようなものがあります。オブジェクト キーでも同じことができますが (どのように機能するかEventHandlerListなど)、文字列キーの方が理解しやすいです ;-p

これは、アクティブに使用されているプロパティと同じだけのスペースを占有します。

最後のオプションは、さまざまなファセットをカプセル化することです。

class Foo {
    public bool IsDesigned {get {return Design != null;}}
    public IDesigned Design {get;set;}
    // etc
}

HereFooはどのインターフェイスも実装していませんが、それらへのアクセスをプロパティとして提供します。

于 2009-02-01T10:19:18.520 に答える
1

動的プロパティの必要性は、モデル内のアーティファクトのさまざまな状態/フェーズから派生しているように見えるため、「Road」および「Pipe」クラスにあまりにも多くのロールを配置している可能性があります。インターフェイスを使用してすべてを「Road」または「Pipe」クラスに入れるのではなく、さまざまなクラスへの関連付けを使用して明示的なモデルを作成することを検討します。

于 2009-02-01T10:21:05.257 に答える