私はこのようなものを持っています:
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
作成されますが、これは意図したものではありません)。
ここで何か不足していますか?もしそうなら、条件 on などの奇妙なものを使用せずに、これをどのように書き直す必要がありますかarg as DerivedArg
。