13

私はしばしば、各オブジェクトがいくつかのインターフェースを実装しなければならないオブジェクトのリストを作成したいと思っていました。たとえば、次のようなことをしたいと思います。

List<T> where T : IConvertible, IComparable _myList;

私が検討したもう1つのオプションは、これら2つのインターフェイスを実装する3番目のインターフェイスを作成して、これら2つのインターフェイスを実装するオブジェクトが本質的に私のものを実装するようにすることでした。

public interface IConvertibleAndComparable
    : IConvertible, IComparable { }

List<IConvertibleAndComparable> _myList;

IConvertibleこれにより、とIComparable、の両方を実装するオブジェクトdoubleint、自分のオブジェクトを追加できるようになります。継承のインターフェース以外に新しい機能が追加されないため、明示的に実装するIConvertibleAndComparable必要はありません。

最初のスニペットは違法であり、2番目のスニペットは合法ですが、私が望むことを実行しないことを理解しています。私がやろうとしていることを達成することは可能ですか?そうでない場合、これらのいずれかが将来のC#機能の候補になりますか?

(注:これは、空のインターフェースの正当なアプリケーションになります。)

編集

より一般的な意味で、私は次のいずれかを実行したいと思います。

private MyGenericClass<T> where T : IA, IB, ... _myClass;

T必要なすべての制限を宣言できる場所、または

public interface IMyCombinedInterface : IA, IB, ... {}
private MyGenericClass<IMyCombinedInterface> _myClass;

ここで、を実装し、本質的に(または暗黙的に)実装するタイプ(IA新しい機能を明示的に宣言しない場合のみ)。IB...IMyCombinedInterfaceIMyCombinedInterface

4

2 に答える 2

5

回避策として、一種の重ね合わせラッパーを実行し、それをリストに格納できます。アイデアはこちらをご覧ください。

あなたの例では、次のことができます。

public class Junction
{
    public IConvertible Convertible { get; private set; }
    public IComparable Comparable { get; private set; }
    private Junction() { }
    public static Junction Create<T>(T value) where T : IConvertible, IComparable
    {
        return new Junction
        {
            Convertible = value,
            Comparable = value
        };
    }
}

次に、リストにsを追加Junctionします。

var l = new List<Junction>();
l.Add(Junction.Create(1));
于 2012-10-17T16:15:49.037 に答える
0

別のプロジェクトに取り組んでいるときに、別の回避策のアイデアがありました。私が投稿した例ではうまくいかないかもしれませんが、との組み合わせインターフェースを作成するという質問の本来の目的ではうまくいく可能性がありますIEnumerable<T>INotifyCollectionChanged@DanielHilgarthが指摘したように)。回避策は次のとおりです。

必要なインターフェースの組み合わせを実装する空のインターフェースを作成します。

public interface INotifyingEnumerable<T> :
    IEnumerable<T>,
    INotifyCollectionChanged
{
}

これらの両方を実装するクラスから継承し、新しいインターフェイスを実装する新しいクラスを作成します。

public class MyObservableCollection<T> :
    ObservableCollection<T>,
    INotifyingEnumerable<T>
{
}

INotifyingEnumerable<T>これで、実装を使用するプロパティタイプとしてインターフェイスを使用できます。

ただし、これが元の要件を完全にカバーしていない理由は、ObservableCollection<T>直接割り当てることができないためです。元の投稿で要求された機能はこれを可能にします。

于 2015-01-20T21:29:19.433 に答える