Статические методы и наследование в Coffeescript - PullRequest
7 голосов
/ 14 июля 2011

Я немного читал о модели наследования coffeescript, и у меня такое чувство, что я нахожусь на грани идеологической дискуссии, которую я действительно не понимаю.Итак, я был бы очень рад узнать, что я просто делаю что-то не так.

По сути, я пишу набор виджетов, которые, помимо прочего, должны обрабатывать события наих элементы DOM.Я подумал, что хороший способ сделать это - иметь метод класса, который будет вызываться один раз, чтобы делегировать все события, которые могут понадобиться виджету.Базовый класс виджетов может иметь несколько простых обработчиков щелчков, тогда как подкласс может добавить к этому некоторые обработчики мыши или дополнительные обработчики щелчков.

Однако, похоже, я не должен пытаться делать эквивалент вызоваsuper() внутри статического метода.Существует обходной путь, (this.__super__.constructor.METHODNAME(), но я видел много предложений, что это не лучший способ сделать то, что я пытаюсь сделать. Кто-нибудь получил какие-либо идеи о том, как я должен структурировать этот код«Продолжать использовать обходной путь или перевести всю делегацию в совершенно другое место». Я не могу просто вставить его в прототип, так как у меня не обязательно будет экземпляр для вызова метода (или я могу по существу вызыватьметод на прототипе из статического контекста, такой как вставка SwatchableWidget.prototype.delegateEvents() в функцию загрузки или что-то в этом роде?

Вот небольшой фрагмент кода, иллюстрирующий то, о чем я говорю:

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()

Спасибо за любую помощь.

Ответы [ 3 ]

3 голосов
/ 15 июля 2011

предлагаю заменить

this.__super__.constructor.delegateEvents()

с

Widget.delegateEvents()

пытаться использовать super для вызова статических методов не требуется (и не имеет особого смысла)

2 голосов
/ 14 июля 2011

Я не понимаю, почему delegateEvents будет методом уровня класса, или почему Widget.delegateEvents нужно вызывать снова из SwatchableWidget.delegateEvents.Если это просто код инициализации класса, вы должны поместить его непосредственно в тело класса:

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

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

Я полагаю, что вы ожидаете определенного состояния DOM, прежде чем запускать этот код инициализации?Возможно, я мог бы предложить другой подход, если бы вы сказали мне немного больше о предварительных условиях для delegateEvents.

1 голос
/ 22 июля 2011

Похоже, вам нужна модель наследования другого типа, в которой каждая унаследованная функция определенного типа («родительский вызов») будет обходить дерево наследования и вызывать всех его родителей с одинаковым именем.

Вы можете вызывать любые прямые родительские функции для каждого дочернего элемента вручную, как вы написали. Затем он будет перемещаться вверх по цепочке наследования везде, где вы указываете такие отношения.

Я бы связал родительский вызов делегата в конструкторе с текущей функцией класса

delegateparents => 
  #call any parent class methods
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...