2011-04-19 33 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。任何使用此模式实现多个接口的对象可以使用部分或全部接口(以任何顺序列出)转换为给定表单的嵌套接口类型。

相关问题