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)
有了这个,我就能够添加同时实现任何物体IConvertible和IComparable,包括double和int,以及我自己的对象.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未明确声明新功能时).
作为一种解决方法,您可以执行一种叠加包装,并将其存储在列表中.看看这里的想法.
举个例子,你可以这样做:
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)