2011-07-14 11 views
7

Czytałem trochę o modelu dziedziczenia coffeescript i mam wrażenie, że jestem na marginesie ideologicznej debaty, której naprawdę nie rozumiem. Byłbym więc szczęśliwy, gdyby dowiedziałem się, że robię wszystko w niewłaściwy sposób.Metody statyczne i dziedziczenie w Coffeespcu

Zasadniczo robię to, pisząc zestaw widżetów, które, między innymi, muszą obsługiwać zdarzenia na swoich elementach DOM. Pomyślałem, że dobrym sposobem na zrobienie tego byłoby posiadanie metody klasy, która byłaby wywoływana raz, aby delegować wszystkie zdarzenia, które widżet może potrzebować. Podstawowa klasa widgetów może mieć kilka prostych procedur obsługi kliknięć, podczas gdy podklasa może dodać do niej niektóre procedury obsługi kursorów myszy lub dodatkowe moduły obsługi kliknięć.

Jednak wydaje się, że nie powinienem próbować wykonywać równoważnego wywołania super() wewnątrz metody statycznej. Istnieje obejście, które istnieje, (this.__super__.constructor.METHODNAME(), ale widziałem wiele sugestii, że nie jest to najlepszy sposób, aby zrobić to, co próbuję zrobić. Czy ktoś ma jakieś informacje na temat tego, jak powinienem zbudować ten kod? korzystając z obejścia lub umieszczając całą delegację w zupełnie innym miejscu? Nie mogę tak po prostu włożyć go do prototypu, ponieważ niekoniecznie będę miał instancję do wywołania tej metody (lub czy w zasadzie wciąż będę mógł nazywać metodę ? na prototypie od statycznego kontekstu, jak oddanie SwatchableWidget.prototype.delegateEvents() do funkcji onload lub coś

Oto fragment kodu do zilustrowania tego, co mówię:

class Widget 
    @testProp: "ThemeWidget" 
    @delegateEvents: -> 
     console.log "delegate some generic events" 

class SwatchableWidget extends Widget 
    @testProp2 = "SwatchWidget" 
    @delegateEvents: -> 
     console.log "delegate some specific swatchable widget events" 
     this.__super__.constructor.delegateEvents() 

Widget.delegateEvents() 
SwatchableWidget.delegateEvents() 

Dzięki za wszelkie Hel str.

Odpowiedz

1

Brzmi jak ty chcą innego modelu dziedziczenia, w którym każda odziedziczona funkcja określonego typu ("rodzicielskie wywoływanie") będzie przechodzić drzewo dziedziczenia i wywoływać wszystkich jego rodziców o tej samej nazwie.

Możesz wywołać dowolne bezpośrednie funkcje rodzicielskie w każdym dziecku ręcznie, tak jak pisałeś. Następnie uaktywni łańcuch dziedziczenia w dowolnym miejscu, w którym określisz taką relację.

chciałbym związać połączenie rodzice delegata w konstruktorze klasy do aktualnej funkcji

delegateparents => 
    #call any parent class methods 
2

Nie rozumiem dlaczego delegateEvents byłaby metoda klasy poziom, lub dlaczego Widget.delegateEvents muszą zostać ponownie wywołany z SwatchableWidget.delegateEvents. Jeśli jest to po prostu klasa kod inicjalizacji, należy umieścić go w ciele klasy bezpośrednio:

class Widget 
    console.log "delegate some generic events" 
    ... 
    @testProp: "ThemeWidget" 

class SwatchableWidget extends Widget 
    console.log "delegate some specific swatchable widget events" 
    ... 
    @testProp2 = "SwatchWidget" 

biorę go czekasz określonego stanu DOM przed uruchomieniem tego kodu inicjalizacji? Może mógłbym zaproponować inne podejście, gdybyś powiedział mi coś więcej o warunkach wstępnych dla delegateEvents.

3

Proponuję zastąpienie

this.__super__.constructor.delegateEvents() 

z

Widget.delegateEvents() 

próbuje użyć Super zadzwonić metody statyczne nie jest wymagane (i nie ma większego sensu)

+0

mi się podoba, ale to każda klasa pochodna wymagane byłoby jawnie wywołać to nadrzędne zdarzenia klasy delegata. Jeśli nazwy klas nadrzędnych zostaną zmienione, zdarzenia delegatów i podobne wywołania będą musiały zostać ręcznie zaktualizowane.Odzyskując moją własną odpowiedź, wciąż nie znam czystego sposobu automatycznego wywoływania, jak funkcje nazwane u rodziców, poza tym, co sugeruje autor pierwotnego pytania. –