|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Как вызвать непереопределенный метод в базовом классе
В соседней ветке речь зашла про super, и там меня похоже не совсем правильно поняли.
Поэтому, чтобы не усложнять пример 2мя классами, рассмотрю вариант только с одним, базовым. Есть класс, есть в нем объявленный метод methodA, который может быть переопределен наследником. Как мне в базовом классе вызвать без обходных путей непереопределенный метод methodA? Вызываю super.methodA(), а в трэйс вываливается ран-тайм ошибка. Может я в чем то ошибся? Или это так и задумано? код вызова: var _a:ClassA = new ClassA(); trace( "_a.methodA(): " + _a.methodA() ); trace( "_a.methodA_super(): " + _a.methodA_super() ); package { public class ClassA { public function ClassA() { } public function methodA():String { return "ClassA::methodA()"; } public function methodA_super():String { return super.methodA(); } } } Цитата:
|
|
|||||
Сейчас попробовать не могу, но может вот так:
package { public class ClassA { private var _thisA:Function; public function ClassA() { _thisA=this.methodA; } public function methodA():String { return "ClassA::methodA()"; } public function methodA_super():String { return _thisA(); } } } Думаю надо в этом направлении думать. |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Спасибо. Просто думаю это как раз один из обходных путей. Хочется узнать почему простого super.methodA() недостаточно
Так то и так можно организовать, и тоже все гуд будет: package { public class ClassA { public function ClassA() { } public function methodA():String { return _super_methodA(); } private function _super_methodA():String { return "ClassA::methodA()"; } public function methodA_super():String { // return super.methodA(); return _super_methodA(); } } } Последний раз редактировалось i.o.; 07.05.2010 в 18:47. |
|
|||||
Регистрация: Jan 2009
Адрес: Северный островок дефолт-сити
Сообщений: 144
|
Ну правильно, я так понимаю раз класс ничего не расширяет, то по-дефолту он расширяет Object.
Вот он тебе и пишет в эксепшене что у Object нет такого метода. Вообщем помоему постановка задачи какая то кривая очень, раз нет никакого наследования здесь - к чему тогда вообще super и всё подобное. |
|
|||||
Можно так, но это как то не красиво
Последний раз редактировалось incvizitor; 07.05.2010 в 19:43. |
|
|||||
Регистрация: Jan 2009
Адрес: Северный островок дефолт-сити
Сообщений: 144
|
Что тут происходит, расскажите мне))
Ну или расскажите, что принять нужно, чтобы это понять?) Цитата:
|
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Цитата:
Вот с наследованием. Как мне вызвать непереопределленный метод суперкласса из самого же суперкласса? код: var _b:ClassB = new ClassB(); trace( "_b.methodA(): " + _b.methodA() ); trace( "_b.methodA_simple(): " + _b.methodA_simple() ); trace( "_b.methodA_super(): " + _b.methodA_super() ); package { public class ClassA { public function ClassA() { } public function methodA():String { return "ClassA::methodA()"; } final public function methodA_simple():String { return this.methodA(); } final public function methodA_super():String { return super.methodA(); } } } package { public class ClassB extends ClassA { public function ClassB() { super(); } override public function methodA():String { return "ClassB::methodA()"; } } } Цитата:
Почему при вызове super.methodA(); лезет в Object, если суперкласс метода - это ClassA? Последний раз редактировалось i.o.; 07.05.2010 в 19:32. |
|
|||||
cauchy, если у Вас есть объект класса ClassA то при вызове methodA_super (такое же тоже возможно) он вернет methodA. В обратном случае класс будет вызывать свойство methodA_super своего суперкласса, таким образом рекурсивно добираясь до класса который непосредственно расширяет ClassA. Но метод предложенный i.o. намного лучше.
Последний раз редактировалось incvizitor; 07.05.2010 в 19:45. |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
incvizitor, похоже вы перепутали getDefinitionByName() с getQualifiedClassName().
В общем подставил, ничего не изменилось. Помнится wvxvw любит использовать super. Он наверняка знает ответ ) Последний раз редактировалось i.o.; 07.05.2010 в 19:44. |
Часовой пояс GMT +4, время: 08:17. |
|
« Предыдущая тема | Следующая тема » |
|
|