Форум 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=137098)

orcpochta 04.03.2010 19:51

Цитата:

Сообщение от chabapok (Сообщение 890988)
Хм, а если явно указать класс, которым итерпретировать объект. Не гарантирую что выйдет, но попробуйте так:
(obj as SupserClass).superClassMethod();
(obj as SuperUnderSuperClass).superClassMethod();
и тд.

нет, так тоже не работает

etc 04.03.2010 19:52

Цитата:

Сообщение от ps_spectre (Сообщение 890989)
Виртуальные функции работают как надо в АС3. Так что не надо.

Не работают, нет эксепшена о том, что метод не переопределен.

orcpochta 04.03.2010 19:54

Цитата:

Сообщение от ps_spectre (Сообщение 890989)
[offtop]
Виртуальные функции работают как надо в АС3. Так что не надо.
[/offtop]

не понял, что вы хотели этим сказать

компилируется - это еще не значит работает
убрать модификатор virtual и разве что-то изменится?

wvxvw 04.03.2010 20:02

На уровне байткода можно создать виртуальную функцию - только оно вам надо? :)

ps_spectre 04.03.2010 20:05

Убедили, назвать нормальной работой - сложно,)

chabapok 04.03.2010 22:30

тогда можно попробовать как-то так
делаем интерфейс

Код AS3:

interface IClassWhoCanCallGrandSuper{
 function callGrandSuper(funcName:String, level);
}
//и наследуем его в базовом классе определив функцию
 
function callGrandSuper(funcName:String, level){
 if (level==0) return this[funcName]();
 else return super.callGrandSuper(funcName, level-1);
}
 
вызываем
 
obj.callGrandSuper(myfunc, 3); //myfunc прадедушки

ну, это только идея, я не проверял как оно работать будет. И даже если будет работать - решение не очень. Не факт, что вызов функции в прадедушки сработает в прадедушку - очень может быть, что этого не произойдет, и тогда просто прийдется прицеплять такой кусок к той функции, которую вы хотите вызывать:

Код AS3:

function myfunc(level=0){
 if (level>0) return super.lmyfunc(level-1)//это цепляем на каждом уровне вложенности
 
 блаблабла ;//это код самой функции на данном уровне вложенности
}
 
//и вызываем:
obj.myfunc(1);//родитель
obj.myfunc(2);//дед
obj.myfunc(3);//прадед и тд
//этот вариант будет работать точно.
//может так даже удобней - не надо писать конструкции типа
//obj.super.super.super.super.myfunc()

и можно еще попытаться (UPD: попытался - не работает, может кто скажет почему?) с именем класса поиграться как-то так (тут тоже не знаю сработает ли проверка (super is NeedClass) ):
Код AS3:

function myfunc(NeedClass){
 if (super is NeedClass) renturn super.myfunc(NeedClass);
 блаблабла;//код на текущем уровне вложенности
}

Добавлено через 23 минуты
последний вариант рабочий если в сравнении написать так:
if (prototype != NeedClass.prototype) return super.myfunc(NeedClass);

orcpochta 07.03.2010 03:49

А вот кстати какая подстава:
Если в суперклассе есть два метода (не private), один из которых вызывается другим:
Код AS3:

public function A ( ):void
{
    B( );
}
 
public function B ( ):void
{
    trace("SuperClass, function B");
}

и класс-наследник перекрывает этот метод суперкласса (вызывающийся из другого метода суперкласса)

Код AS3:

override public function B ( ):void
{
    trace("Extension, function B")
}

то связка методов "A суперкласса вызывает B суперкласса" становится недоступна из класса наследника, а получаем "А суперкласса вызывает B класса-наследника" (что рушит логическую цепочку ф-ий и приводит к непредсказуемым последствиям)

или есть какой-то способ указать, что А должен вызвать B суперкласса, а не B класса-наследника? может как-то через пространства имен?

P.S. сейчас придет многоуважаемый iNils и скажет, что надо называть методы разными именами, а override - он на то и override)))

etc 07.03.2010 22:47

orcpochta, предлагаю финализировать B в A.


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

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