2012-04-13 30 views
6

Genişletmek istediğim bir singleton sınıfı oluşturdum. Bu (yarım), yalnızca sınıfın tek bir örneğini oluşturmasıyla çalışır, ancak alt sınıfa eklenen özellikler tanımsızdır. Benim düğüm uygulamasında aşağıdaki kullanın Şimdi eğerCoffeescript singleton alt sınıfı nasıl oluşturulur

Singleton = require('./singleton') 

class Stinky extends Singleton 
     constructor: -> 
     var1 : 'var1' 


module.exports = Stinky 

:

Stinky = require './stinky' 
thing1 = Stinky.getInstance() 
thing2 = Stinky.getInstance() 
console.log "Thing var1: #{thing1.var1}" 

getInstance() yöntemi davranır burada

class Singleton 
    _instance = undefined 
    @getInstance: -> 
     if _instance is undefined 
     console.log 'no instance exists, so create one' 
     _instance = new _Singleton() 
     else 
     console.log 'an instance already exists.' 

class _Singleton 
    constructor: -> 
     console.log 'new singelton' 

module.exports = Singleton 

Ve alt sınıf olan: Burada orijinal tekil olduğu beklendiği gibi, ancak var1 tanımsızdır. Aynı şeyi tek kişilik olmayan sınıflarda yaparsam iyi çalışırlar. Teşekkürler.

+1

'var1: 'var1' bir yazım hatası mı? Var1 = 'var1' 'veya aslında' @ var1 = 'var1' olmalıdır? – Sandro

cevap

2

Özel bir sınıfı simüle etmeye çalışmak için _Singleton sınıfını nasıl kullandığınızı görüyorum, ancak maalesef bu durumda kullanabileceğinizi düşünmüyorum. İşte

çalışır bazı kod şudur:
class Singleton 
    _instance = undefined 

    constructor: -> 
     console.log 'new singleton' 

    @getInstance: -> 
     if _instance is undefined 
     console.log 'no instance exists, so create one' 
     _instance = new @() 
     else 
     console.log 'an instance already exists.' 
     _instance 

class Stinky extends Singleton 
     constructor: -> 
     console.log 'Stinky constructor' 
     @var1 = 'var1' 


thing1 = Stinky.getInstance() 
thing2 = Stinky.getInstance() 

console.log "Thing var1: #{thing1.var1}"​​​​​​​​​​​​​​​​​​, thing1, thing2​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ 

ben node.js (gerektiren) kodu kaldırıldı, ama bu in'i ekleyerek basit olmalıdır. Ana fark, kodumun oluşturduğu örneğin, bir @ veya this örneğidir. Bunu yapmak, kurucunuzun ilk önce arandığından ve ana zinciri devam ettirdiğinden emin olacaktır. Kodunuz açık bir şekilde _Singleton örneğini oluşturuyordu, böylece Stinky yapıcınız asla çağrılmadı. Sonunda fark edeceğiniz bir diğer küçük sorun, getInstance yönteminizin aslında _instance örneğini döndürmemesiydi. Umarım bu yardımcı olur

,

Sandro

+0

Teşekkürler Sandro. Bir bash verecek. –

12

Ben biraz aşağı kodunuzu kesilmiş. İşte 2 Kalan sınıfları şunlardır:

  • Singleton ve _Singleton
  • Değiştirilen _instance onun prototip yerine Singleton eklenebilir böylece @_instance için Birleştirilmiş:

    class Singleton 
        @_instance: null 
        @getInstance: -> 
        @_instance or= new @(arguments...) 
    
    class Stinky extends Singleton 
        constructor: (@num) -> 
    
    thing1 = Stinky.getInstance(1) 
    thing2 = Stinky.getInstance(2) 
    
    console.log(thing1.num, thing2.num) 
    

    aşağıdaki değişiklikler yaptı

  • GetInstance (argüman gerekli olması durumunda) argümanları uyarısı eklendi
  • GetInstance(), Singleton yerine genişletilmiş nesneye işaretleme

Bu örnekte, 2. kurucunun hiçbir zaman çağrılmadığından emin olmak için 2 farklı numara kullandım.

1

Ben hedefi ne olduğundan emin değilim, ama gerçek singleton'ununu (düz nesne) Singleton yaparak aynı sonucu elde edebilirsiniz: Bu kadar Singleton pek mantıklı değil

Singleton = 
    doNothing: -> 
     # ... 
    doMoreNothing: -> 
     # ... 

class Stinky 
    constructor: -> 
     @var1: 'var1' 
    getInstance: -> 
     return Singleton 

kendini geri döndüren bir yönteme sahip olmak.

+0

Bu, gerçek Coffeescript (ve Javascript) stili için doğru yanıttır. Javascript prototip tabanlı bir dildir, bu yüzden Tekton gibi OOP tasarım kalıpları mantıklı değildir. – Vortico

+0

@Vortico Katılmıyorum. CoffeeScript'in bir 'class' anahtar kelimesine sahip olması, daha tanıdık bir sınıf tabanlı miras modelini taklit etmeyi amaçladığını söyler. Toplum tarafından bakılan CoffeeScript Cookbook'un bir tek [bir Singleton deseninde] sayfası vardır (http://coffeescriptcookbook.com/chapters/design_patterns/singleton). Ne yazık ki, sayfa mirastan söz etmiyor. :( –

İlgili konular