我经常想创建一个对象列表,其中每个对象都必须实现多个接口(interface)。例如,我想做类似于以下的事情:
List<T> where T : IConvertible, IComparable _myList;
我考虑的另一个选择是创建第三个接口(interface)来实现这两个接口(interface),这样任何实现这两个接口(interface)的对象都可以内在地实现我的接口(interface)。
public interface IConvertibleAndComparable
: IConvertible, IComparable { }
List<IConvertibleAndComparable> _myList;
有了这个,我将能够添加任何同时实现了 IConvertible
和 IComparable
的对象,包括 double
和 int
,以及我自己的对象。不需要显式实现 IConvertibleAndComparable
,因为它不会在继承的接口(interface)之外添加任何新功能。
我知道第一个代码段是非法的,第二个代码段虽然合法,但不符合我的要求。是否有可能实现我想要做的事情?如果不是,这些中的任何一个是否会成为 future C# 功能的候选者?
(注意:这将是空接口(interface)的合法应用程序。)
编辑
在更一般的意义上,我想执行以下操作之一:
private MyGenericClass<T> where T : IA, IB, ... _myClass;
我可以在T
上声明我需要的所有限制,或
public interface IMyCombinedInterface : IA, IB, ... {}
private MyGenericClass<IMyCombinedInterface> _myClass;
其中任何实现了 IA
、IB
和 ...
的类型都固有地(或隐含地)实现了 IMyCombinedInterface
(仅当 IMyCombinedInterface
未明确声明新功能时)。
最佳答案
作为解决方法,您可以做一种叠加包装,并将其存储在列表中。看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));
关于c# - 固有实现的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12937519/