2010-09-08 57 views
2

在C#中,可以使用两种接口限制来定义方法参数。这与界限。例如。具有多种接口限制的方法参数

interface IA 
{ 
    int A {get;} 
} 
interface IB 
{ 
    int B {get;} 
} 
void Foo<T>(T param1) where T: IA, IB {} 

所以该方法Foo的两个接口,并且所述第一参数(param1)应实现两个接口。

但这真的有用吗? AFAIK不可能将对象转换为C#中的多个接口?当然,一个类可以实现两个接口。

+0

的[?是否有可能使一个参数实现两个接口]可能重复(http://stackoverflow.com/questions/772053 /是它可能使一个参数实现两个接口) – 2014-11-18 11:39:08

+0

@RobertMacLean不是重复的。这是另一种方式 – Julian 2014-11-19 11:04:27

回答

2

如果模板化类需要来自多个接口的功能,这非常有用。例如,也许您需要相互比较的课程,IComparable,并且您还希望确保模板课程的用户记得覆盖ToString(),以便可以显示数据IFormattable

这是一个有些人为的答案,但能够多次指定精确的接口,使您可以在其界面中保留功能而不会混乱。

3

你当然可以在同一时间将其分配给一个:

IA asIA = param1; 
IB asIB = param1; 

此外,你可以使用它作为无论是,即使没有这些行(假设这些都需要一个IA或IB参数,分别)

IAFunc(param1); 
IBFunc(param1); 
+0

@凯斯,我不关注。首先,'Foo'不是一种类型的方法,所以“是一个Foo”是没有意义的。其次,'IAFunc'和'IBFunc'都不必知道param1也是IB或IA(分别)。他们可以将其视为其名称中的常规实例。 – 2010-09-08 01:31:50

+0

忘记它。我明白你所说的你可以做的是在Foo作为一种方法的背景下。 – KeithS 2010-09-08 01:36:53

4

有时候你有通用化的逻辑,它需要同时从多种类型的功能。例如,我曾经不得不在ASP.NET的ButtonLinkButtonImageButton控件上执行相同的逻辑。它们分别来自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; 
} 
+0

+1很好的例子。 – linuxuser27 2010-09-08 16:24:18