1

次のような顧客階層があります。

abstract class Customer {
    public virtual string Name { get; set; }
}

class HighValueCustomer : Customer {
    public virtual int MaxSpending { get; set; }
} 

class SpecialCustomer : Customer {
    public virtual string Award { get; set; }
}

顧客を取得するときに、編集/変更するプロパティを Web フォームに表示したいと考えています。現在、if ステートメントを使用して子顧客タイプを見つけ、特殊なプロパティを表示しています。プレゼンテーション層で「if」ステートメントを回避できるように、デザインパターン(訪問者?)またはより良い方法はありますか? どのようにしますか?

詳細情報: これは、nHibernate バックエンドを備えた asp.net Web サイトです。各顧客タイプには、ページ上に独自のユーザー コントロールがあり、顧客タイプに応じて自動的にロードしたいと考えています。

4

4 に答える 4

2

よりクリーンな組織とは、表示コントロールまたはフォーマットの並列階層を持つことだと思います。おそらく、Abstract Factory Patternのようなものを使用して、CustomerとCustomerFormの両方のインスタンスを同時に作成します。返されたCustomerFormインスタンスを表示します。これにより、追加のプロパティと、それらを表示および編集する方法がわかります。

于 2009-03-12T03:53:30.327 に答える
2

リフレクションを使用して、サブクラス (インスタンス) に固有のプロパティのリストを取得できますか? (エラーが発生しにくくなります。)

そうでない場合は、特別なプロパティを返す (仮想) メソッドを作成します。(エラーが発生しやすくなります!)

後者の例:

abstract class Customer {
    public virtual string Name { get; set; }

    public virtual IDictionary<string, object> GetProperties()
    {
        var ret = new Dictionary<string, object>();
        ret["Name"] = Name;
        return ret;
    }
}

class HighValueCustomer : Customer {
    public virtual int MaxSpending { get; set; }

    public override IDictionary<string, object> GetProperties()
    {
        var ret = base.GetProperties();
        ret["Max spending"] = MaxSpending;
        return ret;
    }
} 

class SpecialCustomer : Customer {
    public virtual string Award { get; set; }

    public override IDictionary<string, object> GetProperties()
    {
        var ret = base.GetProperties();
        ret["Award"] = Award;
        return ret;
    }
}

いずれにせよ、Web ページにセクション ( fieldsets?) を作成したい場合は、そこで機能するためif、この余分なコーディングは面倒で役に立たないものになります。

于 2009-03-12T00:58:28.237 に答える
0

次のようなことを試しましたか:

public class Customer<T>
    where T : Customer<T>
{
    private T subClass;
    public IDictionary<string, object> GetProperties()
    {
        return subClass.GetProperties();
    }
}

次のサブクラスを使用:

public class FinancialCustomer : Customer<FinancialCustomer>
{
}

これは私の頭の上から外れているので、うまくいかないかもしれません。CSLA.NET でこのタイプのコードを見たことがあります。これはBusinessBase.csと呼ばれる CSLA.NET クラスへのリンクです。これは、上で示したものと同様の定義を持っています。

于 2009-03-12T01:29:08.943 に答える