从非generics类重写抽象generics方法

基类

class Drawer { public abstract void Draw(T type); } 

派生类#1

 class ADrawer : Drawer { public override void Draw(List list) { foreach (var a in list) { DrawA(a); } } public void DrawA(Agent a) { //draw code here } } 

派生类#2

 class AnotherDrawer : Drawer { public override void Draw(T number) { if (number == 1) { //draw code } } } 

错误发生在#1派生类中:“找不到合适的方法来覆盖”

我应该在基类中使用“虚拟”还是“抽象”?

如何设置基本参数类型以允许派生类中的各种参数?

您的代码存在的问题多于您提出的问题。 暂时不考虑覆盖问题,类ADrawer需要一个类型约束( where T : Agent ):

 class ADrawer : Drawer { public void Draw(List list) where T : Agent { foreach (var a in list) { DrawA(a); } } public void DrawA(Agent a) { //draw code here } } 

没有这个约束,将a传递给DrawA是不合法的,因为a是类型T的引用,没有约束,就没有从类型T到类型Agent隐式转换。

AnotherDrawer类非法使用==运算符。 将==运算符应用于类型为Tint操作数是不可能的。 你可以通过使用object.Equals覆盖来解决这个问题。

最后,基类有一个错误,因为它是一个包含抽象成员的非抽象类。

但是,一般情况下,此代码表明该类应该是通用的,而不是方法

 abstract class Drawer { public abstract void Draw(T type); } 

派生类#1

 class ADrawer : Drawer> { public override void Draw(List list) { foreach (var a in list) { DrawA(a); } } public void DrawA(Agent a) { //draw code here } } 

派生类#2

 class AnotherDrawer : Drawer { public override void Draw(int number) { if (number == 1) { //draw code } } } 

要跟进Eric Lippert的评论,这也是我对你的问题的第一反应,你可能会考虑这个设计:

 abstract class Drawer { public abstract void Draw(T type); public void DrawMany(IEnumerable types) { foreach (var t in types) Draw(t); } } 

派生类#1

 class ADrawer : Drawer { public override void DrawA(Agent a) { //draw code here } } 

派生类#2没有变化。

抽象方法应该有这个signeture

  public abstract void Draw(List type); 

要使其编译,请将基类更改为:

 class Drawer { public abstract void Draw(List type); } 

ListT ,因此当您在派生类’方法中传入List ,不能覆盖基本方法,因为它具有T参数,而不是List参数。