有沒有一種方法來定義像List一樣的類中的類型以包含僅實現的對象多個接口?可能是類型和接口。包含在一個列表中的多個接口<T>
例如:
List<myObjectBase, IDisposable, IClonable> myList;
有沒有一種方法來定義像List一樣的類中的類型以包含僅實現的對象多個接口?可能是類型和接口。包含在一個列表中的多個接口<T>
例如:
List<myObjectBase, IDisposable, IClonable> myList;
不知道如果我理解正確的,但如何對這樣的:
class MyList<T> : List<T>
where T : myObjectBase, IDisposable, IClonable
{
}
這種方式可以只將對象添加到從基礎派生並實現這些接口的列表中。
這是一個很好的解決方案。爲了記錄,類繼承實際上會耗費內存和CPU嗎?說一個非繼承類與一個繼承5次相比,說多少錢?如果我不得不這樣做很多,可能不會那麼優雅。對我目前的情況來說,這很好。 – jsmars 2011-04-19 13:32:01
@jsmars它很便宜,你不需要關心。成本是固定的;無所謂的繼承鏈是多久。 .NET以與C++基本相同的方式實現,使用「vtable」 - [Wikipedia關於此的文章](http://en.wikipedia.org/wiki/Virtual_method_table)並不差。 – 2011-04-19 13:37:28
不喜歡這種解決方案。引入派生的List
號在這種情況下,你必須表達下列方式:
public class CommonStuff : MyObjectBase, IDisposable, IClonable {}
然後,你可以寫:
List<CommonStuff> myList;
無,不支持多個通用參數。
它也沒有多大意義。使用通用List<T>
類而不是類似於ArrayList
的東西將沒有好處。你會失去所有類型安全的好處,並且你仍然不得不把所有東西都扔到這個地方。
更好的選擇是創建能夠處理所有你想要做的事情的複合類...然後使用:
public class CommonBase : MyBaseClass, ICloneable, IDisposable
{
}
,然後用它作爲你的泛型參數:
var newList = new List<CommonBase>();
在.net中可以有一個方法接受具有多個約束的泛型類型的參數。如果可以指定列表<T>將僅存儲實現IFoo和IBar的對象,則可以將該列表中的項目傳遞給需要實現IFoo和IBar的類型的例程。否則,如果IFoo和IBar沒有共同的祖先,那麼沒有好的方法來投射某種未知類型的對象,這些對象實現了IFoo和IBar的方式,以便讓它傳遞給需要它傳遞的例程在對象實現IFoo和IBar。 – supercat 2011-08-29 22:40:18
您可以使用ArrayList並可以檢查此列表中的對象的類型 - 可能它更方便。
if(list[i] is Type)
問題是關於如何*增加*靜態類型安全檢查,你的建議是*放棄*靜態類型安全檢查。這似乎是朝相反方向邁出的一步,而不是解決所提出的問題。此外,如果您想要任意對象的列表,請使用列表
下面是用於添加爲我工作多接口的最簡單的解決方案。
列表<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(){}
}
一種方法可能有益的是定義一個接口ISelf <出Ť>,其一個構件,自,簡單地返回「這「作爲T;那麼對於任何可能結合的接口,定義一個通用版本,不管什麼< out T >,它繼承了IWhatever和ISelf <T>。在這種情況下,一類靠尖端,它實現的IFoo < whizbang的>和伊巴爾< whizbang的>將隱式實現ISelf < whizbang的>,IFoo的<伊巴爾< whizbang的> >,伊巴爾< IFoo的< whizbang的> >等。需要實現IFoo和IBar的例程可以接受IFoo類型的參數<IBar>;該參數將實施IFoo;其自身屬性將實現IBar。任何使用此模式實現多個接口的對象可以使用部分或全部接口(以任何順序列出)轉換爲給定表單的嵌套接口類型。
你是說你想要這三種類型的選項能夠存儲在你的列表中嗎? (所以你可以填充一個myObjectBase類來實現IDisposable或一個實現IClonable的類?) – 2011-04-19 13:09:29