有没有一种方法来定义像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