c# - C# 中从指定类型继承的模板类的等价物是什么?

标签 c# c++ templates

<分区>

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# 中,您通常会使用组合 而不是继承 来解决这个问题。

在这种情况下,组合意味着以下两种情况之一:

  1. 您的类仍然具有通用参数,但不会尝试从中派生。此外,它有 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());

关于c# - C# 中从指定类型继承的模板类的等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12161983/

相关文章:

c++运算符重载,

c++ - 如何在另一个线程中暂停/中断 boost::thread?

c++ - 使用嵌套模板进行模板化

c# - 在具有端点路由的 ASP.NET Core 中使用 CreatedAtRouteResult 生成带有段的 URL

c# - 使用 C# 代替 Python 的 Blender

c# - 使用 .NET 在同一个进程中执行多个命令行

c++ - 共享 bool 值的缓存一致性 c++11

c++ - Typedef是在C++编译时解析的吗?

c++在一个类中使用模板和虚方法

c# - NHibernate 自动重命名 C# 中的列名