Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как вызвать непереопределенный метод в базовом классе (http://www.flasher.ru/forum/showthread.php?t=139667)

i.o. 07.05.2010 18:31

Как вызвать непереопределенный метод в базовом классе
 
В соседней ветке речь зашла про super, и там меня похоже не совсем правильно поняли.
Поэтому, чтобы не усложнять пример 2мя классами, рассмотрю вариант только с одним, базовым.

Есть класс, есть в нем объявленный метод methodA, который может быть переопределен наследником. Как мне в базовом классе вызвать без обходных путей непереопределенный метод methodA? Вызываю super.methodA(), а в трэйс вываливается ран-тайм ошибка. Может я в чем то ошибся? Или это так и задумано?

код вызова:
Код AS3:

var _a:ClassA = new ClassA();
 
 
trace( "_a.methodA(): " + _a.methodA() );
trace( "_a.methodA_super(): " + _a.methodA_super() );

ClassA:
Код AS3:

package
{
        public class ClassA
        {
                public function ClassA()
                {
                }
 
 
                public function methodA():String
                {
                        return "ClassA::methodA()";
                }
 
                public function methodA_super():String
                {
                        return super.methodA();
                }
        }
}

трэйс:
Цитата:

_a.methodA(): ClassA::methodA()
ReferenceError: Error #1070: Method methodA not found on Object
at ClassA/methodA_super()
at test_fla::MainTimeline/frame1()

incvizitor 07.05.2010 18:42

Сейчас попробовать не могу, но может вот так:

Код AS3:

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

?

Думаю надо в этом направлении думать.

i.o. 07.05.2010 18:44

Спасибо. Просто думаю это как раз один из обходных путей. Хочется узнать почему простого super.methodA() недостаточно

Так то и так можно организовать, и тоже все гуд будет:
Код AS3:

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

Но какое то чувство остается, что должно быть проще ))

cauchy 07.05.2010 19:00

Цитата:

Сообщение от i.o. (Сообщение 906666)
Вызываю super.methodA(), а в трэйс вываливается ран-тайм ошибка.

Ну правильно, я так понимаю раз класс ничего не расширяет, то по-дефолту он расширяет Object.
Вот он тебе и пишет в эксепшене что у Object нет такого метода.

Вообщем помоему постановка задачи какая то кривая очень, раз нет никакого наследования здесь - к чему тогда вообще super и всё подобное.

incvizitor 07.05.2010 19:10

Можно так, но это как то не красиво :(

Код AS3:

final public function methodA_super():String
{
        if(getQualifiedClassName(this)!="ClassA"){
              if(getQualifiedClassName(super)=="classA")
                    return super["methodA"];
              else
                    return super["methodA_super"];
        }
        else
            return methodA();
}


cauchy 07.05.2010 19:18

Что тут происходит, расскажите мне))
Ну или расскажите, что принять нужно, чтобы это понять?)


Цитата:

Есть класс, есть в нем объявленный метод methodA, который может быть переопределен наследником. Как мне в базовом классе вызвать без обходных путей непереопределенный метод methodA?
this.methodA();

i.o. 07.05.2010 19:25

Цитата:

раз нет никакого наследования здесь - к чему тогда вообще super и всё подобное.
Да потому что с наследованием тоже самое. Написал же в самом начале, что упростил до одного класса специально.

Вот с наследованием. Как мне вызвать непереопределленный метод суперкласса из самого же суперкласса?

код:
Код AS3:

var _b:ClassB = new ClassB();
 
 
trace( "_b.methodA(): " + _b.methodA() );
trace( "_b.methodA_simple(): " + _b.methodA_simple() );
trace( "_b.methodA_super(): " + _b.methodA_super() );

ClassA:
Код AS3:

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

ClassB:
Код AS3:

package
{
        public class ClassB extends ClassA
        {
                public function ClassB()
                {
                        super();
                }
 
 
                override public function methodA():String
                {
                        return "ClassB::methodA()";
                }
        }
}

трэйс:
Цитата:

_b.methodA(): ClassB::methodA()
_b.methodA_simple(): ClassB::methodA()
ReferenceError: Error #1070: Method methodA not found on Object
at ClassA/methodA_super()
at test_fla::MainTimeline/frame1()
Вот как мне сделать, чтобы methodA_super() всегда вызвал непереопределенный methodA(), т.е чтобы возвращал "ClassA::methodA()". Я вот хочу в суперклассе ClassA всегда работать с непереопределенным методом methodA(). Как мне это сделать без всяких private function _super_methodA():String
Почему при вызове super.methodA(); лезет в Object, если суперкласс метода - это ClassA?

incvizitor 07.05.2010 19:27

cauchy, если у Вас есть объект класса ClassA то при вызове methodA_super (такое же тоже возможно) он вернет methodA. В обратном случае класс будет вызывать свойство methodA_super своего суперкласса, таким образом рекурсивно добираясь до класса который непосредственно расширяет ClassA. Но метод предложенный i.o. намного лучше.

i.o. 07.05.2010 19:39

incvizitor, похоже вы перепутали getDefinitionByName() с getQualifiedClassName().
В общем подставил, ничего не изменилось.

Помнится wvxvw любит использовать super. Он наверняка знает ответ )

incvizitor 07.05.2010 19:44

Да, перепутал :) Ну не знаю, я написал:

Код AS3:

super.methodA();

выдало ошибку при компиляции.

Код AS3:

super["methodA"]

Ошибку при компиляции не выдало.


Часовой пояс GMT +4, время: 13:43.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.