2016-03-05 2 views
0

Допустим, у меня есть 3-х классов, которые наследуют друг друга, и все отменяют тот же метод:Вызов метода базового класса (а не непосредственный родительский класс)

class Base 
    foo: -> 
     console.log 'base' 

class Middle extends Base 
    foo: -> 
     console.log 'middle' 

class Child extends Middle 
    foo: -> 
     console.log 'child' 

Если мне нужно вызвать реализацию Middle «S из Child, я могу использовать super. Но что, если мне нужно будет назвать реализацию Base? Поддерживает ли coffescript это?

+0

Не так далеко, насколько я знаю. Вы можете передать флаг 'Middle.foo()', чтобы сообщить ему, чтобы он возвращал 'Base.foo()' ... Но, что еще более важно, вы уверены, что это то, чего вы действительно хотите? Если 'Child' наследует от' Middle', но хочет называть 'foo' на' Base', то, возможно, 'Child' не должен наследовать от' Middle'? Или, может быть, вы не должны переопределять 'foo' вообще, а делать отдельные функции? По моему опыту, использование такого рода наследования и функции, переопределяющих слишком много, может привести к довольно запутанному коду! – Carpetsmoker

+0

Я согласен, что это плохой дизайн. У меня есть бизнес-логика организации, представленная как дюжина классов coffescript, наследующих друг друга. Миксины были бы идеальны для такого наследования, но у coffescript их нет. –

ответ

1

Это немного некрасиво, но это возможно:

class Child extends Middle 
    foo: -> 
    console.log 'child' 
    @constructor.__super__.constructor.__super__.foo() 

Я не знаю, если это может быть короче.

+0

Это не работает в моем конкретном случае, потому что мне нужно получить доступ к переменным экземпляра «Child», но это полезно знать. –

+0

Это ответ на ваш вопрос. Вы можете задать новый вопрос с проблемой переменных. – KyleK

Смежные вопросы