2012-06-24 124 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