2015-03-13 6 views
0

В других языках объектно-ориентированного программирования, следующая общая форма абстракцииCoffeeScript Наследование: Статические переменные/методы

class AbstractClass 
    myVar: null 

    @doSomething: -> 
    console.log myVar 

class Child extends AbstractClass 
    myVar: 'I am a child' 

Вызов Child.doSomething() должен печатать «Я ребенок». Я также должен передать Child.doSomething в качестве обратного вызова и напечатать его. Я пробовал все комбинации с или без @, используя точки с запятой и равные для определения myVar, я не могу понять это. Каков правильный способ сделать это в CoffeeScript?

редактировать

Я думаю, что упрощать мой пример, потому что я не могу заставить его работать (дальнейшее редактирование: сейчас работает с этим решением). Вот реальный код (с предложенным решением в месте):

class AbstractController 
    @Model: null 

    @index: (req, res) -> 
    console.log @ 
    console.log @Model 
    @Model.all?(req.params) 

class OrganizationController extends AbstractController 
    @Model: require "../../classes/community/Organization" 

В моем файле маршрутизации

(express, controller) -> 
    router = express.Router({mergeParams: true}) 
    throw new Error("Model not defined") unless controller.Model? 
    console.log controller 
    router 
    .get "/:#{single}", _.bind(controller.show, controller) 
    .get "/", _.bind(controller.index, controller) 
    .post "/", _.bind(controller.post, controller) 

Передача OrganizationController этой функции правильно регистрирует объект OrganizationController, так что я знаю, что там получают:

{ [Function: OrganizationController] 
    Model: { [Function: Organization] ...}, 
    index: [Function], 
    __super__: {} } 

Но когда я ударил по этому пути, два console.log звонки распечатать

{ [Function: AbstractController] 
    Model: null, 
    index: [Function] } 
null 

И я получаю сообщение об ошибке: «Не удается прочитать свойство„все“в нуль»

ответ

3

Вы отсутствовали несколько @ с. Следующие отпечатки I am a child:

class AbstractClass 
    @myVar: null 

    @doSomething: -> 
    console.log @myVar 

class Child extends AbstractClass 
    @myVar: 'I am a child' 

Child.doSomething() 

Но если вы хотите, чтобы передать его в функцию обратного вызова, вам нужно привязать его к Child:

callf = (f) -> 
    f() 

callf Child.doSomething    # prints undefined 
callf Child.doSomething.bind(Child) # prints I am a child 
Смежные вопросы