2012-01-25 135 views
1

有一個Java庫類:斯卡拉類替代

class DefaultFieldFactory { 
    ... 
    public static String createCaptionByPropertyId(Object propertyId) { ... } 
    ... 
} 

class FieldFactory extends DefaultFieldFactory { 
    ... 
    // Lot of methods that use DefaultFieldFactory.createCaptionByPropertyId 
    ... 
} 

我使用Scala的項目FieldFactory類,我需要改變createCaptionByPropertyId方法。

如何在沒有AOP的情況下重寫FieldFactory類?

是否可以用包中的DefaultFieldFactory類實現替換?這是相對簡單和短。

在此先感謝, Etam。

+0

你不能**重寫**靜態方法。 –

+0

我不想**重寫**它,我想強制FieldFactory使用我的實現createCaptionByPropertyId方法。 – Etam

+1

@Etam這就是所謂的覆蓋。 –

回答

2

一個靜態類將進入Scala中的object,它不會繼承DefaultFieldFactory的靜態方法 - 事實上,這反映了您不能覆蓋靜態的事實。

這是爲什麼靜力學會皺起眉頭的原因之一。

+0

好的,我知道,但我所要求的是 - 您可以以某種方式替換某個類中的方法,在這種情況下是靜態類。 – Etam

1

我認爲有一個hacky的方式來做到這一點......但如果你有原始java類的源代碼,我強烈建議你改變它。

如果不是,您可以創建一個DefaultFieldFactory的新實現作爲您類中隱藏原始實現的類中的對象。然後執行DefaultFieldFactory對象可以調用原來的java impliment。

// in package x.y.a 
class DefaultFieldFactory { 
    ... 
    public static String createCaptionByPropertyId(Object propertyId) { ... } 
    ... 
} 

// in package x.y.b 
class FieldFactory extends DefaultFieldFactory { 

    object DefaultFieldFactory{ 


    def createCaptionByPropertyId(propertyId: AnyRef): String { 
     //import the original implimentation 
     import x.y.b.DefaultFieldFactory._ 
     ... 
    } 
    } 


    // Lot of methods that use DefaultFieldFactory.createCaptionByPropertyId 
    ... 
} 

就像我說的...不好!