2014-03-03 54 views
1

我構建了一組對象來表示位於我的angularjs應用程序和後端API之間的數據抽象層。我爲此使用了coffeescript(一部分是爲了學習coffeescript,部分原因是我喜歡他們的類實現,因爲我最初來自Days of Yore的C++和java背景)。[java | coffee]腳本中的繼承類靜態覆蓋模式?

所以我有類似

Class Animal 
@_cache: {} 

...東西...

Class Dog extends Animal 
@_cache: {} 

等。這個問題(這顯然是一個語法糖的東西)是我想讓Dog的所有具體子類都有它們自己的緩存實例。我可以通過上面的方式處理它(只需重寫屬性),或者使用@_cache [@ constructor.name] = {}之類替換該緩存,並編寫緩存訪問器函數,而不是直接與之交互。

基本上,我想表達的模式是:「Property#{name}應該是此對象上的類級(或靜態)屬性,並且所有擴展類都應該有它自己的此屬性實例」,而無手動必須在每個子類型上執行該操作。有沒有合理的模式來做到這一點?

+0

爲什麼他們需要自己的高速緩存?這些實例是否特別緩存?那麼值得明確地聲明自己的緩存。無論如何,我認爲你正在尋找AbstractFactory模式,或者一個簡單的「動物類」混合。 – Bergi

+0

如果將它設爲靜態,那麼它將不會被繼承,它將屬於特定的類。那麼你爲什麼不簡單地做一個'Animal.cache = {}'?從那裏開始,你將不得不直接通過任何實例訪問'Animal'類中的緩存。如果是這種情況,你可以單獨定義一個緩存對象。 –

回答

2

我有一個建議,使用實例的動態指針指向自己的類:@constructor

在這個例子中,緩存被一審創建初始化,並在構造函數本身填充。

class Animal 
    # is is just here to distinguish instances 
    id: null 

    constructor:(@id) -> 
    # @constructor aims at the current class: Animal or the relevant subclass 
    # init the cache if it does not exists yet 
    @constructor._cache = {} unless @constructor._cache? 

    # now populates the cache with the created instance. 
    @constructor._cache[@id] = @ 

class Dog extends Animal 
    # no need to override anything. But if you wish to, don't forget to call super(). 

# creates some instances 
bart = new Animal 1 
lucy = new Dog 1 
rob = new Dog 2 

console.log "animals:", Animal._cache 
# prints: Object {1=Animal} 
console.log "dogs:", Dog._cache 
# prints: Object {1=Dog, 2=Dog} 

看到這個fiddle(控制檯上的結果)