C# 固有实现的接口

C# 固有实现的接口,c#,inheritance,interface,multiple-inheritance,C#,Inheritance,Interface,Multiple Inheritance,我经常想创建一个对象列表,其中每个对象必须实现许多接口。例如,我想做如下类似的事情: List<T> where T : IConvertible, IComparable _myList; private MyGenericClass<T> where T : IA, IB, ... _myClass; 在这里,我可以声明我需要的T的所有限制,或者 公共接口IMY组合接口:IA、IB、。。。{} 私有MyGenericClass\u myClass; 当任何实现I

我经常想创建一个对象列表,其中每个对象必须实现许多接口。例如,我想做如下类似的事情:

List<T> where T : IConvertible, IComparable _myList;
private MyGenericClass<T> where T : IA, IB, ... _myClass;
在这里,我可以声明我需要的
T
的所有限制,或者

公共接口IMY组合接口:IA、IB、。。。{}
私有MyGenericClass\u myClass;

当任何实现
IA
IB
..
的类型内在地(或隐式地)实现
IMyCombinedInterface
(仅当
IMyCombinedInterface
没有显式声明新功能时)时。

作为一种解决方法,您可以执行一种叠加包装,并将其存储在列表中。寻找想法

根据您的示例,您可以执行以下操作:

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
        };
    }
}

在做另一个项目时,我想到了另一个解决办法。虽然对于我发布的示例可能不太有效,但它可能符合问题的初衷,即为
IEnumerable
INotifyCollectionChanged
创建一个组合界面(正如@DanielHilgarth指出的)。解决办法如下:

创建一个空接口,实现所需接口的组合

public interface INotifyingEnumerable<T> :
    IEnumerable<T>,
    INotifyCollectionChanged
{
}
公共接口INotifyingEnumerable:
我数不清,
INotifyCollectionChanged
{
}
创建一个新类,该类继承实现这两个类的类,并实现新接口

public class MyObservableCollection<T> :
    ObservableCollection<T>,
    INotifyingEnumerable<T>
{
}
公共类MyObservableCollection:
可观察的收集,
可枚举的
{
}
现在,您可以使用接口
INotifyingEnumerable
作为属性类型,它使用您的实现


然而,这并没有完全涵盖原始需求的原因是,它不允许直接分配
observeablecollection
。原始帖子中要求的功能将允许此操作。

我已编辑了您的标题。请看,“,其中的共识是“不,他们不应该”。@JohnSaunders我理解,但你为什么删除我的“谢谢”?我认为这是不可能的,但这确实是一个不错的功能。这将有助于实现另一个场景:MVVM及其ObservableCollections。目前,当你真正想要的只是一个
INotifyCollectionChanged
IList
时,你必须使用具体的
ObservableCollection
类。他问的是,如果可能的话,C#功能注释是次要的,而不是问题本身。@Servy:嗯,不是真的。虽然所有这些类都实现了
IConvertible
IComparable
,但它不允许创建列表实例来将float、double和Person实体添加到同一个列表中。这就是OP提出的问题。这个想法很有趣,但我同意OP在这个问题上的观点,因为肯定有“额外的负担”。@gregsdennis:这就是为什么它是一个解决办法。现在,你有权在这个或其他解决方案之间做出平衡的选择,考虑到所有的利弊…我将此作为答案,因为考虑到当前的限制,这似乎是实现最终目标的最实际的方法。然而,进一步讲,每次您想要组合两个接口时,都必须创建一个新的类似于连接的类型,因此它可能会变得非常混乱。@gregsdennis:您可以创建一个通用的
连接。
var l = new List<Junction>();
l.Add(Junction.Create(1));
public interface INotifyingEnumerable<T> :
    IEnumerable<T>,
    INotifyCollectionChanged
{
}
public class MyObservableCollection<T> :
    ObservableCollection<T>,
    INotifyingEnumerable<T>
{
}