include и this.$super

22 views
Skip to first unread message

Vic Khomyackov

unread,
Aug 10, 2012, 3:42:59 AM8/10/12
to right...@googlegroups.com
Здравствуйте! У меня есть такой вот вопрос про наследование и перекрытие методов:

Допустим, есть класс-родитель ParentClass, и его потомок ChildClass, и в обоих есть реализация метода initialize, но с разными наборами аргументов. Внутри ChildClass#initialize this.$super будет указывать на ParentClass#initialize, как и было задумано. Теперь при включении модуля в ChildClass с помощью SomeClass.include({initialize: function(){}}) в ChildClass#initialize this.$super будет указывать на предыдущую реализацию (которая кроме как через this.$super больше никак не видна).

Собственно вопрос в том, что предыдущая реализация initialize мне никак не нужна - я хочу полностью её заменить, и хочу вызывать ParentClass#initialize, а он просто так уже не доступен. Что делать? Заменять initialize без помощи include()?

И более общий вопрос: получается, что поведение this.$super зависит от порядка включения модулей, то есть если есть два модуля с одинаково названным методом, и такой же метод в классе-предке, но с другой сигнатурой (другим набором аргументов), то в зависимости от порядка включения модулей в класс-потомок в первом из модулей this.$super будет указывать на метод класса-предка (с другой сигнатурой), а во втором - на метод первого модуля (с той же сигнатурой). Как тут разобраться?

Nikolay Nemshilov

unread,
Aug 11, 2012, 12:34:07 AM8/11/12
to right...@googlegroups.com

Привет,

В этом случае всегда можно вызвать родительский класс через его прототип,

ParentClass.prototype.initialize.call(this, arg, arg,... )

Vic Khomyackov

unread,
Aug 13, 2012, 7:48:37 AM8/13/12
to right...@googlegroups.com

ParentClass.prototype.initialize.call(this, arg, arg,... )

Да, я это понимаю, но проблема с двусмысленностью this.$super всё равно остаётся?

Nikolay Nemshilov

unread,
Aug 13, 2012, 8:16:04 AM8/13/12
to right...@googlegroups.com

Мм. Нет никакой двусмысленности,  $super всегда вызывает предыдущий метод.

Reply all
Reply to author
Forward
0 new messages