固有实现的接口

gre*_*nis 13 c# inheritance interface multiple-inheritance

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

List<T> where T : IConvertible, IComparable _myList;
Run Code Online (Sandbox Code Playgroud)

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

public interface IConvertibleAndComparable
    : IConvertible, IComparable { }

List<IConvertibleAndComparable> _myList;
Run Code Online (Sandbox Code Playgroud)

有了这个,我就能够添加同时实现任何物体IConvertibleIComparable,包括doubleint,以及我自己的对象.IConvertibleAndComparable不需要显式实现,因为它不会在继承中的接口之外添加任何新功能.

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

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

编辑

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

private MyGenericClass<T> where T : IA, IB, ... _myClass;
Run Code Online (Sandbox Code Playgroud)

我可以在哪里声明T我需要的所有限制,或者

public interface IMyCombinedInterface : IA, IB, ... {}
private MyGenericClass<IMyCombinedInterface> _myClass;
Run Code Online (Sandbox Code Playgroud)

任何实现IA,IB以及...固有(或隐式)实现的类型IMyCombinedInterface(仅当IMyCombinedInterface未明确声明新功能时).

Jor*_*dão 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
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

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

var l = new List<Junction>();
l.Add(Junction.Create(1));
Run Code Online (Sandbox Code Playgroud)