2

同様の問題があり、説明しやすいのでコードで表現しようとしました。

基本的に、私は汎用コレクションを持っているので、インスタンス化されたコレクションのタイプに関係なく、いくつかの共通のプロパティとイベントがあります。そして、私はこれらの共通のプロパティに興味があります。

たとえば、ジェネリック コレクションのインスタンス化されたオブジェクトがあるとします。これらのプロパティを取得してイベントをサブスクライブする最良の方法は何ですか? インターフェイスを実装してインターフェイス定義にキャストすることでそれができることは理解していますが、単一の要件を満たすためにそれを行っているだけなので、それは好きではありません。これをリファクタリングするより良い方法はありますか?

public interface IDoNotLikeThisInterfaceDefinitionJustToPleaseGetDetailMethod
{
    string Detail { get; }

    event Action<bool> MyEvent;
}

public class MyList<T> : List<T>
    //, IDoNotLikeThisInterfaceDefinitionJustToPleaseGetDetailMethod
{
    public string Detail
    {
        get;
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyList<int> mi = new MyList<int>();
        MyList<string> ms = new MyList<string>();
        MyList<char> mc = new MyList<char>();
        GetDetail(mi);
        GetDetail(ms);
        GetDetail(mc);
    }

    //please note that obect need not be mylist<t>
    static string DoSomeWork(Object object)
    {
        //Problem: I know myListObect is generic mylist
        //but i dont know which type of collection it is
        //and in fact i do not care
        //all i want is get the detail information

        //what is the best way to solve it
        //i know one way to solve is implement an interface and case it to get details
        var foo = myListObject as IDoNotLikeThisInterfaceDefinitionJustToPleaseGetDetailMethod;
        if (foo != null)
        {
            //is there another way?
            //here i also need to subsribe to the event as well?
            return foo.Detail;
        }
        return null;
    }
}
4

3 に答える 3

3

メソッドをジェネリックにすることができます:

static string GetDetail<T>(MyList<T> myList)
{
    return myList.Detail;
}

これにより、既に記述したのと同じコードで呼び出すことができ、インターフェースを完全に排除できます。


コメントに応じて編集:

タイプがわからず、 をチェックしているだけだとすると、objectここではインターフェースが最善のアプローチであるように思えます。共通のインターフェイスを提供すると、コレクション内に何が含まれているかに関係なく、必要なすべてのメンバーを公開でき、正しい動作が提供されます。

于 2013-06-18T17:31:53.387 に答える
2

GetDetailメソッドをジェネリックにします。

static string GetDetail<T>(MyList<T> list)
{
    return list.Detail;
}
于 2013-06-18T17:31:55.957 に答える
1

編集: 複数のコレクション クラスが関与する可能性があると想定しています。実際にクラスが1 つしかない場合MyList<T>は、ジェネリック メソッドを使用するのが絶対に正しい方法です。

インターフェイスを実装してインターフェイス定義にキャストすることでできることは理解していますが、1つの要件を満たすためにやっているだけなので、好きではありません。

コレクションの共通点を表現するためにやっているのです。共通メンバーがインターフェースを実装していない限り、それらはたまたま同じ名前を持っているだけです.インターフェースは、それらが同じ意図された意味を持っていることを示しています.

ここではインターフェイスを使用するのが正しい方法ですが、GetDetailメソッドがインターフェイスをパラメーターとして使用しない理由は明らかではありません...メソッドがまったく必要であると仮定します。

于 2013-06-18T17:32:12.170 に答える