问题描述
我从一个基础模型类派生了一堆模型。以下是一个此类子模型的示例:
namespace MyProject.Models
{
public abstract class Parent1 {}
}
namespace MyProject.Models
{
public class Child1: Parent1 { ... }
}
这些模型中的每一个都具有非常一致的功能,我在称为“处理程序”的单独类中对其进行编码。有一个基本处理程序,用于定义方法名称:
namespace MyProject.Models
{
public abstract class Parent1Handler
{
public abstract void Update(Parent1 model);
}
}
但是当我尝试创建派生处理程序时,.NET 对我的参数类型不满意:
namespace MyProject.Models
{
public class Child1Handler: Parent1Handler
{
public override void Update(Child1 model) { ... }
}
}
它本质上要求我使用 Parent1
类型的参数来覆盖我的方法。但是 Child1
派生自 Parent1
; Child1
类型的参数不应该是合适的替代品吗?
解决方法
正如评论者所指出的,这不是覆盖的工作方式。您根本无法更改被覆盖方法的签名。您可以将 Child1 的实例传递到您的重写 Update
方法中,但您不能更改签名。
要实现您想要做的事情,您必须利用泛型
public class Parent1Handler<TChild> where TChild : Parent1
{
public abstract void Update(TChild model);
}
public class Child1Handler: Parent1Handler<Child1>
{
public override void Update(Child1 model)
{
....
}
}
这允许您为每个继承模型拥有一个单独的子项 Handler
。但是,我会检查自己并确保这确实是您想要做的事情。模型继承可能是一个陷阱。它可以促进代码重用,但它也可能很快导致噩梦,很难弄清楚特定的逻辑片段在哪里。如果您打算继承模型,我强烈建议您不要深入一层。