如何解决.NET MVC 模型对象的多态性
我从一个基础模型类派生了一堆模型。以下是一个此类子模型的示例:
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
。但是,我会检查自己并确保这确实是您想要做的事情。模型继承可能是一个陷阱。它可以促进代码重用,但它也可能很快导致噩梦,很难弄清楚特定的逻辑片段在哪里。如果您打算继承模型,我强烈建议您不要深入一层。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。