2012-06-24 88 views
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创建,这不是意图)。

我在这里错过了什么吗?如果是这样,我应该怎么重写这个,而不使用奇怪的东西,如arg as DerivedArg条件。

+2

无法重现。通过你给出的代码(固定使'A.DoSomething'虚拟),你在底部给出的代码*调用'A.Create(DerivedArg)'。请显示一个简短但完整的程序,它实际上证明了你所声称的内容。 –

回答

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

+0

不,我进入它并调用'A.Create(BaseArg arg)'。 – mnn