在C#中,可以定义具有两个接口限制的方法参数。这有界限。例如。
interface IA
{
int A {get;}
}
interface IB
{
int B {get;}
}
void Foo<T>(T param1) where T: IA, IB {}
因此,两个接口和方法param1
的第一个参数(Foo
)应该实现两个接口。
但这真的有用吗? AFAIK是不可能将对象转换为C#中的多个接口?当然一个类可以实现两个接口。
答案 0 :(得分:4)
有时您会使用通用化逻辑,这种逻辑需要同时使用多种类型的功能。例如,我曾经不得不在ASP.NET的Button
,LinkButton
和ImageButton
控件上执行相同的逻辑。它们各自分别派生自WebControl
并实现IButtonControl
接口;没有将它们统一起来的基类。
我需要将处理程序连接到由Click
公开的IButtonControl
事件,并通过Attributes
集合设置客户端点击处理程序,该集合由WebControl
公开。要启用同时执行这两种操作的方法,我唯一的选择是多种类型约束:
private T CreateButton<T>() where T : WebControl, IButtonControl, new()
{
var button = new T();
button.Click += ...;
button.Attributes["onClick"] = ...;
return button;
}
答案 1 :(得分:3)
您当然可以将其分配给一个:
IA asIA = param1;
IB asIB = param1;
此外,你可以使用它,即使没有这些行(假设它们分别采用IA或IB参数)
IAFunc(param1);
IBFunc(param1);
答案 2 :(得分:2)
如果模板化类需要来自多个接口的功能,这非常有用。例如,您可能要求类可以相互比较IComparable,并且还要确保模板类的用户记住覆盖ToString()
以便显示数据,{{3 }}
这有点像一个人为的答案,但能够多次指定精确的界面,可以让你在界面中保持功能,而不会让一个人混乱。