2014-02-24 112 views
2

有一個我不能控制的類Gold。它有一個工廠方法:用工廠方法創建子類對象

public static Gold TransmuteFromLead(Lead someLead); 

我現在繼承金,使我自己的類GoldWatch。我有一個Lead對象。有沒有辦法在GoldWatch中編寫TransmuteFromLead方法,該方法以某種方式使用Gold的TransmuteFromLead方法但創建了GoldWatch對象?

對於類似但不完全相同的問題,請參閱What's the correct alternative to static method inheritance?但是我的情況不同,因爲我不控制基類。

+0

如果您在GoldWatch上有GoldWatch CreateWatch(Gold someGold)方法,您可以創建黃金然後創建手錶。我想不出直接創建它的好方法。 – Maess

+0

雖然偶爾可能會很方便,但沒有簡單的方法。您必須手動創建「Lead」或「Gold」的轉換。如果你還需要複製一些私人領域,這可能是不可能的(以一種乾淨的方式)。核心問題是,儘管一些數據在'Gold'和'GoldWatch'之間共享,但最終它們是兩個不同的對象。像他們的內存組織這樣的事情是JIT編譯器的實現細節,所以實際上沒有任何事情可以通過。如果你真的需要這樣做,你可能不得不使用反射,它仍然是棘手的。 – Luaan

回答

2

你可以使用一個隱含的操作:

public static implicit operator GoldWatch(Gold g) 
{ 
    return new GoldWatch(g); 
} 

,然後在GoldWatch添加一個構造函數從Gold對象發起本身。

這將允許你這樣做:

var goldWatch = (GoldWatch)TransmuteFromLead(someLead); 

,甚至這樣的:

GoldWatch goldWatch = TransmuteFromLead(someLead); 
2

對於黃金的任何額外的公共方法,你包起來GoldWatch,只是調用相同的方法上gold實例。

class GoldWatch : Gold { 
    Gold gold; 

    private GoldWatch(Gold gold) { 
     this.gold = gold; 
    } 

    GoldWatch TransmuteFromLead(Lead someLead) { 
     return new GoldWatch(Gold.TransmuteFromLead(someLead)); 
    } 
} 
相關問題