1

原則として、「T には、List を返す String パラメーターを持つメソッドがあります」と言いたいと思います。詳細に言えば、インターフェイス ICanCreateListOfObjectsFromString を呼び出すことができます。可能なアプリケーションは検索かもしれません。

インターフェイスに静的メソッドがあればいいのにと思いますが、C# ではそれが許可されていないことはわかっています。クラスでこの種のコントラクト実装を指定する別のアプローチは何ですか?

編集:次のコードが必要です:

public interface ISearch
{
    static List<T> Search<T>(String s);
}

public class MyObject : ISearch {
    List<MyObject> Search(string s) {
        //...
    }
}

public List<T> DoFooSearch<T:ISearch> () {
        return T.Search("Foo");
}

public List<T> DoBarSearch<T:ISearch> () {
        return T.Search("Bar");
}

このコードがコンパイルされない理由はお分かりいただけると思いますが、これは私が達成したいことの精神を表しています。これで私の意図が少し明確になることを願っています。

4

3 に答える 3

1

Mixin を実装しようとしているようですね...そのようなものが C# 3.0 に存在し、「拡張メソッド」という名前が付けられています。

あなたは何をすることができますか?ええと、指定した型で機能する関数を作成し、それらにメソッドを「追加」できます。そのタイプはインターフェイスになる可能性があるため、これによりインターフェイスの具体的な関数を定義できます。

確かに、これらの関数はインターフェイス コード自体の一部ではありませんが、インターフェイスの実装の一部でもありません。つまり、「グラスが半分いっぱい」のシナリオです。

(簡単な検索で、Implementing Mixins with C# Extension Methods にたどり着きました。)

または、インターフェイスを実装するクラスに多重継承が必要ない場合は、インターフェイスの代わりに抽象クラスを使用して、具象関数を直接実装することができます。しかし、これは、そのクラス以外からの継承 (および他のインターフェースの実装) をあきらめることを意味します。

于 2009-01-14T07:00:31.687 に答える
0

最初のオプションは、2つの懸念を分離することです。

  • エンティティとなる1つのタイプ
  • 工場となる1つのタイプ

次に、ファクトリのインターフェイスを作成し、それを使用できます(基本的にエンティティの以前の静的メソッドと同様)。

もう1つのオプションは、デリゲートで話すことです。つまり、Func<string,List<...>>(一部のリストタイプの場合)。次に、デリゲートを簡単に作成できます。

Func<string,List<...>> func = SomeType.SomeMethod; // static method

次に、回しfuncて、(後で)次のように使用できます。

List<...> data = func("abc");
于 2009-01-13T23:18:46.173 に答える
0

たぶん、工場のパターンがあなたが探しているものです。

于 2009-01-13T23:17:54.617 に答える