2011-04-05 21 views
0

有什麼設計模式可以將以下代碼重構爲編譯時類型安全的東西(即無類型轉換)?是否有一種設計模式將派生對象傳遞給基類方法而無需投射?

public abstract class Base1 { 
    public abstract void DoStuff(Base2 b); 
} 

public class Specific1 : Base1 { 
    public override void DoStuff(Base2 b) { 
     var s = (Specific2)b; 
     // do clever things with s 
    } 
} 

public abstract class Base2 { } 
public class Specific2 : Base2 { } 

回答

1

如果你想訪問在Specific2介紹(因此,不會在其基類,和Base2所定義的)具體方法,你沒有其他選擇,而不是投放。

除非你使用泛型(在C#遠東):

public abstract class Base1<T> where T : Base2 
{ 
    public abstract void DoStuff(T b); 
} 

public class Specific1 : Base1<Specific2> 
{ 
    public override void DoStuff(Specific2 b) {} 
} 

但是,這使限制你的Specific1類,當然,那是你只能通過Specific2實例的DoStuff方法。

1

在Java中,你可以這樣做:

public abstract class Base1<T extends Base1> { 
public abstract void DoStuff(T b); 
} 

public class Specific1 extends Base1<Specific2> { 
    public override void DoStuff(T b) { 
     var T = b; 
     // do clever things with s 
    } 
} 
2

看起來你可能要考慮double dispatch這裏,即在Specific1#DoStuff()調用b.DoStuff()。 Base1不應該變得太聰明與其他類做什麼。

+2

+1提寧寧的維基:) – 2011-04-05 19:20:14

相關問題