2

次の状況を考慮してください。

ある可能性がありますCategories; Childrenから派生Categories; そしてどこかに、次のようなメソッドが必要です。

ChildType[] Get(ParentType parent) { ... }

ChildTypeから派生していませんParentType; このメソッドは、親のIDに基づいて子を取得するためのファクトリメソッドであるため、これらの名前が付けられています。

現在、私は次のようなものを持っています:

static class CatFactory<ChildType, ParentType> : Category
    where ParentType: Category
    where ChildType: Category, new()
{
    public static ChildType[] Get(string catname, ParentType parent)
    {
        // ...
    }
}

class ParentCategoryA : Category { }

class ParentCategoryB: Category { }

class ChildCategoryA: Category { }

class ChildCategoryB: Category { }

そして、私はこのように工場を呼びます:

CatFactory<ChildCategoryA, ParentCategoryA>.Get(someparent);

これの目的は、IDを持つ強い型の親インスタンスが与えられた場合、そのIDを持つWebサービスにアクセスしてから、新しい子インスタンスを逆シリアル化することです。

これは私の口に悪い味を残します。ChildCategoryA親がであることがわかっているはずParentCategoryAであり、を呼び出すことができるはずChildCategoryA.Get(someparent)です。もちろん、これは子の実装ごとにを定義することで可能static Get()ですが、大量の反復コードが必要になります。

だから-これを行うための最良の方法は何ですか?個別のファクトリクラス、またはいいえ?

4

2 に答える 2

3

この質問は少し紛らわしいと思います。これは私があなたがやりたいと思うことです:

カテゴリオブジェクトが与えられると、指定されたタイプのそのカテゴリのすべての子を見つける方法を知っている静的メソッドを記述します。

それが正しければ、拡張メソッドを提案します。

static class CategoryExtensions
{
    public static T[] GetChildren<T>(this Category parent)
        where T : Category, new()
    {
        // Do whatever...
    }
}

次に、任意のカテゴリオブジェクトを指定して、次のように記述できます。

ChildCategory[] children = parent.GetChildren<ChildCategory>();
于 2013-01-09T20:47:19.887 に答える
0

1 つのアイデアは、リフレクションを使用して、実行時に必要な型を見つけることです。これは遅く、一般的には推奨されません。その場合、複数回の反映を避けるために、結果をキャッシュするのが賢明です。

リフレクションを伴わない別の方法は、子が静的初期化子の何らかのレジストリに自分自身を追加することGet<TChild, TParent>です。これにより、関係の知識を「ローカル」に保ちながら、必要なメソッドを簡単に作成できます。

個人的には、そのような関係がすべてコンパイル時にわかっていれば、すべてを 1 か所にまとめて、すべてが定義されている場所を思い出す手間を省くことができます。=)

于 2013-01-09T21:29:57.640 に答える