对泛型如何与继承一起使用感到困惑

时间:2019-07-12 21:23:46

标签: c#

我试图在工作中重构一些代码,但遇到了一些问题。假设我有以下代码(为说明问题而进行了大大简化):

抽象的Row类:

abstract class Row 
{

}

扩展Row的具体Row类

class SpecificRow : Row
{

}

采用泛型类型并带有接受ICollection的方法的接口:

interface IDbInsertable<T> 
{
   void InsertToDb(ICollection<T> list);
}

实现上述接口的抽象类:

abstract class BaseDownloader: IDbInsertable<Row>
{
   public abstract void InsertToDb(ICollection<Row> list);
   //and other unrelated methods...
}

扩展BaseDownloader的具体类:

class SpecificDownloader : BaseDownloader 
{
  public void InsertToDb(ICollection<SpecificRow> list)
  {
     //implementation
  }
  //other stuff
}

在SpecificDownloader类中,出现错误“ SpecificDownloader未实现继承的抽象成员'BaseDownloader.InsertToDb(ICollection<Row>)

我尝试过的:

  1. 保存所有代码并重新编译
  2. 在这种情况下,将public void InsertToDb()更改为public override void InsertToDb() 错误消息变为'SpecificDownloader.InsertToDb不适合 方法被覆盖”。
  3. 重新启动Visual Studio

从理论上看,以上内容在我看来应该可以正常工作,但是这不能让我编译,也没有理由。如果我错过了重要的事情,请告诉我。

1 个答案:

答案 0 :(得分:4)

使BaseDownloader成为通用类。并添加强制T为行类型的类型约束。像这样

//Class implements the interface and uses the Generic type T from basedownloader. And that has the type constraint
abstract class BaseDownloader<T> : IDbInsertable<T> where T : Row
{
    //This forces T to always be a type row
    public abstract void InsertToDb(ICollection<T> list);
    //and other unrelated methods...
}

然后从basedownloader继承时,指定所需的行类型。 像这样

//Class now gives specificrow as the generic type when inheriting from basedownloader
class SpecificDownloader : BaseDownloader<SpecificRow>
{
    //Now InsertToDb has a collection of SpecificRow instead of just row
    public override void InsertToDb(ICollection<SpecificRow> list)
    {
        //implementation
    }
    //other stuff
}

有关generic type constraints的更多信息