2010-09-08 58 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