0

私はこのようなものを持っています:

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

4

1 に答える 1

2

正しいファクトリ メソッドが実行されています。内部にブレークポイントを設定します。

    public static B Create(DerivedArg arg)
    {
        return new B(arg); /* set breakpoint */
    }

type のローカル変数を定義したため、実行されていないように見えますA

A a = A.Create(arg);

public static B Create(DerivedArg arg)が適切に呼び出され、 type のインスタンスBが返され、 type としてボックス化されていAます。

于 2012-06-24T16:47:30.003 に答える