微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.NET MVC 模型对象的多态性

如何解决.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 举报,一经查实,本站将立刻删除。