我有这样的事情:
class BaseArg { }
class DerivedArg : BaseArg { }
interface IDoSomething
{
void DoSomething();
}
class A : IDoSomething
{
public BaseArg Value { get; set; }
public A(BaseArg value)
{
this.Value = value;
}
public static A Create(BaseArg arg)
{
return new A(arg);
}
public static B Create(DerivedArg arg)
{
return new B(arg);
}
public virtual void DoSomething()
{
}
}
class B : A
{
public DerivedArg DerivedValue { get; set; }
public B(DerivedArg value)
: base(value)
{
this.DerivedValue = value;
}
public override void DoSomething()
{
// does something different from A.DoSomething()
// uses additional stuff in DerivedArg
}
}
然而,即使我这样做:
DerivedArg arg = new DerivedArg();
A a = A.Create(arg);
调用 A.Create(BaseArg arg)
(因此创建A
,这不是意图)。
我在这里遗漏了什么吗?如果是这样,我应该如何在不使用诸如arg as DerivedArg
上的条件之类的奇怪内容的情况下重写它。
答案 0 :(得分:2)
正在执行正确的工厂方法。在以下内容中设置断点:
public static B Create(DerivedArg arg)
{
return new B(arg); /* set breakpoint */
}
在您 中显示,由于您已定义A
类型的本地变量,因此未执行
A a = A.Create(arg);
正确调用 public static B Create(DerivedArg arg)
,并返回B
类型的实例,并将其列为A
类型。