我试图在工作中重构一些代码,但遇到了一些问题。假设我有以下代码(为说明问题而进行了大大简化):
抽象的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>)
”
我尝试过的:
public void
InsertToDb()
更改为public override void InsertToDb()
错误消息变为'SpecificDownloader.InsertToDb不适合
方法被覆盖”。 从理论上看,以上内容在我看来应该可以正常工作,但是这不能让我编译,也没有理由。如果我错过了重要的事情,请告诉我。
答案 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的更多信息