【发布时间】:2022-01-13 08:33:43
【问题描述】:
我有以下工厂:
public class ChildFactory : IChildFactory {
public Child? GetChild(ChildType childType)
{
switch (childType)
{
case ChildType.Boy:
return new BoyChild() { };
case ChildType.Girl:
return new GirlChild() { };
case ChildType.Undecided:
return new UndecidedChild() { };
default:
return null;
}
}
}
每当我通过ChildType 以生成Child 时,我都会返回正确的孩子实例:
Child? child = _childFactory.GetChild((ChildType)Enum.Parse(typeof(ChildType), childDto.Type));
似乎在这一点上,child 是正确的类型(比如说BoyChild)。
现在我想使用方法重载分别动态验证每个子类型。界面如下:
public interface IChildValidator
{
public ValidationResult Validate(BoyChild child);
public ValidationResult Validate(GirlChild child);
public ValidationResult Validate(UndecidedChild policy);
}
但是每当我尝试在上面的方法中使用它时,我都会收到错误CS1503: Cannot convert from 'Child' to 'BoyChild'。
我想我应该以不同的方式声明 child,说“它可以是任何子类型”,但我不知道该怎么做。
提前致谢。
【问题讨论】:
-
我不知道你的整个代码,但我认为你可能会更好地将验证逻辑放在子类中:
public abstract class Child { public abstract ValidationResult Validate(); }这可以帮助你,例如开闭原则。 -
谢谢。我实际上已经按照您建议的方式实现了它,但是在模型内部包含业务逻辑我感到不舒服。
-
@SomeBody 请您详细说明一下,这样的实现(将验证逻辑作为模型的一部分)对代码的开放性和封闭性有何贡献?
-
@noamyg 您可以添加新类型的
Child,而无需更新您的IChildValidator。 -
我认为任何基于一组固定方法重载的解决方案都不尊重使用接口和可扩展性的选择。您不能添加实现该接口的新子类型,而不会错过处理它的重载。所以我的观点是方法重载不是要走的路。
标签: c# overloading factory