固有实现的接口

时间:2012-10-17 15:11:07

标签: c# inheritance interface multiple-inheritance

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

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

我考虑的另一个选择是创建一个实现这两个接口的第三个接口,以便实现这两个接口的任何对象本身都实现了我的。

public interface IConvertibleAndComparable
    : IConvertible, IComparable { }

List<IConvertibleAndComparable> _myList;

通过这个,我可以添加任何实现IConvertibleIComparable的对象,包括doubleint,以及我自己的对象。不需要显式实现IConvertibleAndComparable,因为它不会在继承中的接口之外添加任何新功能。

据我所知,第一个片段是非法的,第二个是合法的,不符合我的要求。是否有可能实现我想做的事情?如果没有,这些中的任何一个都会成为未来C#功能的候选者吗?

(注意:这将是空接口的合法应用程序。)

修改

从更一般的意义上讲,我想执行以下操作之一:

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

我可以在T声明我需要的所有限制,

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

其中任何实现IAIB...的类型本身(或隐式)实现IMyCombinedInterface(仅当IMyCombinedInterface未明确声明时新功能)。

2 个答案:

答案 0 :(得分:5)

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

您可以这样做:

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

然后将Junction添加到您的列表中:

var l = new List<Junction>();
l.Add(Junction.Create(1));

答案 1 :(得分:0)

在处理另一个项目时,我想到了另一个解决方法。虽然它可能不适用于我发布的示例,但它可以用于问题的原始意图,即为IEnumerable<T>INotifyCollectionChanged创建组合界面(正如@DanielHilgarth指出的那样)。解决方法如下:

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

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

创建一个新类,该类继承自实现这两者的类并实现新接口。

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

现在您可以使用接口INotifyingEnumerable<T>作为属性类型,使用您的实现。

然而,这并不完全涵盖原始要求的原因是它不允许直接分配ObservableCollection<T>。原帖中要求的功能允许这样做。