2011-04-19 48 views
0

有沒有一種方法來定義像List一樣的類中的類型以包含僅實現的對象多個接口?可能是類型接口。包含在一個列表中的多個接口<T>

例如:

List<myObjectBase, IDisposable, IClonable> myList; 
+0

你是說你想要這三種類型的選項能夠存儲在你的列表中嗎? (所以你可以填充一個myObjectBase類來實現IDisposable或一個實現IClonable的類?) – 2011-04-19 13:09:29

回答

6

不知道如果我理解正確的,但如何對這樣的:

class MyList<T> : List<T> 
    where T : myObjectBase, IDisposable, IClonable 
{ 
} 

這種方式可以只將對象添加到從基礎派生並實現這些接口的列表中。

+0

這是一個很好的解決方案。爲了記錄,類繼承實際上會耗費內存和CPU嗎?說一個非繼承類與一個繼承5次相比,說多少錢?如果我不得不這樣做很多,可能不會那麼優雅。對我目前的情況來說,這很好。 – jsmars 2011-04-19 13:32:01

+0

@jsmars它很便宜,你不需要關心。成本是固定的;無所謂的繼承鏈是多久。 .NET以與C++基本相同的方式實現,使用「vtable」 - [Wikipedia關於此的文章](http://en.wikipedia.org/wiki/Virtual_method_table)並不差。 – 2011-04-19 13:37:28

+0

不喜歡這種解決方案。引入派生的List 類型來表示容器中的元素的共同性「感覺」對我來說是錯誤的。 – Achim 2011-04-19 13:57:40

1

號在這種情況下,你必須表達下列方式:

public class CommonStuff : MyObjectBase, IDisposable, IClonable {} 

然後,你可以寫:

List<CommonStuff> myList; 
1

無,不支持多個通用參數。

它也沒有多大意義。使用通用List<T>類而不是類似於ArrayList的東西將沒有好處。你會失去所有類型安全的好處,並且你仍然不得不把所有東西都扔到這個地方。

更好的選擇是創建能夠處理所有你想要做的事情的複合類...然後使用:

public class CommonBase : MyBaseClass, ICloneable, IDisposable 
{ 
} 

,然後用它作爲你的泛型參數:

var newList = new List<CommonBase>(); 
+1

在.net中可以有一個方法接受具有多個約束的泛型類型的參數。如果可以指定列表<T>將僅存儲實現IFoo和IBar的對象,則可以將該列表中的項目傳遞給需要實現IFoo和IBar的類型的例程。否則,如果IFoo和IBar沒有共同的祖先,那麼沒有好的方法來投射某種未知類型的對象,這些對象實現了IFoo和IBar的方式,以便讓它傳遞給需要它傳遞的例程在對象實現IFoo和IBar。 – supercat 2011-08-29 22:40:18

0

您可以使用ArrayList並可以檢查此列表中的對象的類型 - 可能它更方便。

if(list[i] is Type) 
+3

問題是關於如何*增加*靜態類型安全檢查,你的建議是*放棄*靜態類型安全檢查。這似乎是朝相反方向邁出的一步,而不是解決所提出的問題。此外,如果您想要任意對象的列表,請使用列表,而不是ArrayList。 – 2011-04-19 14:14:14

1

下面是用於添加爲我工作多接口的最簡單的解決方案。

列表<ICommonInterface> myList中=新列表<ICommonInterface>()

myFirstClass m1C = new myFirstClass(); 
mySecondClass m2C = new mySecondClass(); 

myList.Add(m1C); 
myList.Add(m2C); 

foreach (var item in myList) 
{ 
    item.Clone(); 
    item.Dispose(); 
} 

class myFirstClass : ICommonInterface 
{ 
// implement interface methods 
} 

class mySecondClass : ICommonInterface 
{ 
// implement interface methods 
} 


interface ICommonInterface : IDisposable, IClonable 
{ 
} 


interface IDisposable 
{ 
    void Dispose(){} 
} 

interface IClonable  
{ 
    void Clone(){} 
} 
1

一種方法可能有益的是定義一個接口ISelf <出Ť>,其一個構件,自,簡單地返回「這「作爲T;那麼對於任何可能結合的接口,定義一個通用版本,不管什麼< out T >,它繼承了IWhatever和ISelf <T>。在這種情況下,一類靠尖端,它實現的IFoo < whizbang的>和伊巴爾< whizbang的>將隱式實現ISelf < whizbang的>,IFoo的<伊巴爾< whizbang的> >,伊巴爾< IFoo的< whizbang的> >等。需要實現IFoo和IBar的例程可以接受IFoo類型的參數<IBar>;該參數將實施IFoo;其自身屬性將實現IBar。任何使用此模式實現多個接口的對象可以使用部分或全部接口(以任何順序列出)轉換爲給定表單的嵌套接口類型。