. 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。然而,我会检查你自己,确保这真的是你想要做的。模型继承可能是一个陷阱。它可以促进代码重用,但也可能很快导致难以确定特定逻辑块在哪里的噩梦。如果你打算继承模型,我强烈建议你不要超过一层。

最新更新