从非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类非法使用==
运算符。 将==
运算符应用于类型为T
和int
操作数是不可能的。 你可以通过使用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); }
List
与T
,因此当您在派生类’方法中传入List
,不能覆盖基本方法,因为它具有T
参数,而不是List
参数。