如何从泛型父级继承

时间:2013-10-06 23:06:37

标签: c# generics inheritance

我有一个父类

public class GenericRepository<TEntity> where TEntity : class
    {
      //Implementation
    }

我想从这个班继承,但我似乎无法做到正确,这是我的尝试

public class CustomerRepository<Customer> : GenericRepository<Customer> 
    {
       //implementation
    }

或者这个,

public class CustomerRepository<T> : GenericRepository<T> where T : new Customer()
    {

    }

或者这个

 public class CustomerRepository<T> : GenericRepository<CustomerRepository<T>> where T : CustomerRepository<T>
    {

    }

无论我做什么,我都会收到此错误。请告诉我如何从这个类继承,类共享相同的命名空间

错误'GenericRepository'不包含带有0个参数CustomerRepository.cs

的构造函数

4 个答案:

答案 0 :(得分:4)

听起来你想要一个从泛型继承的非泛型类,如下所示:

public class CustomerRepository : GenericRepository<Customer>
{
}

如果您希望这是一个缩小泛型参数类型的泛型类(只允许Customer或派生类型):

public class CustomerRepository<T> : GenericRepository<T>
    where T : Customer
{
}

关于编译时错误:

  

Error 'GenericRepository<Customer>' does not contain a constructor that takes 0 arguments

这正是它所说的。您尚未在派生类中定义构造函数,这意味着隐式生成了构造函数,就像您键入了这样:

public CustomerRepository() : base() { }

但是,基类(GenericRepository<Customer>)没有不带参数的构造函数。您需要在派生类CustomerRepository中显式声明构造函数,然后在基类上显式调用构造函数。

答案 1 :(得分:1)

您不需要在派生类中重复type参数,因此:

public class CustomerRepository : GenericRepository<Customer> 
    {
       //implementation
    }

是你需要的。

答案 2 :(得分:0)

使用可写为:

 public class CustomerRepository : GenericRepository<Customer> 
 {
        //implementation
 }

答案 3 :(得分:0)

您的基类似乎没有没有参数的构造函数,如果是这样,派生类必须声明a.constructor并使用参数调用基类构造函数。

class MyBase { public MyBase(object art) { } }
class Derived : MyBase {
    public Derived() : base(null) { }
 }

在此示例中,如果从Derived中删除ctor,则会出现相同的错误。