Possible Duplicate:
Why cannot C# generics derive from one of the generic type parameters like they can in C++ templates?
Generic class that inherits its generic type
我希望能够只在 C# 中做这样的事情:
template<class MyClass>
class MockComposite : MyClass
{
};
上面的类继承自指定的类型。 MyClass 是一个基本类型,这就是我想要这种行为的原因。我希望能够使用从 MyClass 派生的类实例化此对象。
我知道您不能在 C# 中使用模板,但是有没有什么方法可以在不必为每种不同类型的对象编写新类的情况下获得我想要的行为?
编辑 - 我希望能够实例化一个对象来测试任何类的行为,只要该类派生自指定类型 - 'MyClass'。
在 C# 中,您有泛型的概念。以下代码等同于您的 C++ 代码:
class MockComposite<T> : T
where T : MyClass
{
}
不幸的是,它是无效的。您将得到以下编译错误:
Cannot derive from 'T' because it is a type parameter
在 C# 中,您通常会使用组合 而不是继承 来解决这个问题。
在这种情况下,组合意味着以下两种情况之一:
您的类仍然具有通用参数,但不会尝试从中派生。此外,它有 new
约束,这意味着泛型参数需要有一个默认构造函数:
class MockComposite<T>
where T : MyClass, new()
{
T _toTest;
public MockComposite()
{
_toTest = new T();
}
}
这意味着您可以像这样实例化模拟类:var mock = new MockComposite<ClassA>();
无需创建 ClassA
的实例在模拟类(class)之外。
class MockComposite
{
MyClass _toTest;
public MockComposite(MyClass toTest)
{
_toTest = toTest;
}
}
这意味着您必须像这样实例化模拟类:var mock = new MockComposite(new ClassA());