Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.03.2010, 19:51
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 11  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Цитата:
Сообщение от chabapok Посмотреть сообщение
Хм, а если явно указать класс, которым итерпретировать объект. Не гарантирую что выйдет, но попробуйте так:
(obj as SupserClass).superClassMethod();
(obj as SuperUnderSuperClass).superClassMethod();
и тд.
нет, так тоже не работает
__________________
скриптограф

Старый 04.03.2010, 19:52
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 12  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от ps_spectre Посмотреть сообщение
Виртуальные функции работают как надо в АС3. Так что не надо.
Не работают, нет эксепшена о том, что метод не переопределен.

Старый 04.03.2010, 19:54
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 13  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Цитата:
Сообщение от ps_spectre Посмотреть сообщение
[offtop]
Виртуальные функции работают как надо в АС3. Так что не надо.
[/offtop]
не понял, что вы хотели этим сказать

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

Старый 04.03.2010, 20:02
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 14  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
На уровне байткода можно создать виртуальную функцию - только оно вам надо?
__________________
Hell is the possibility of sanity

Старый 04.03.2010, 20:05
ps_spectre вне форума Посмотреть профиль Отправить личное сообщение для ps_spectre Найти все сообщения от ps_spectre
  № 15  
Ответить с цитированием
ps_spectre
 
Аватар для ps_spectre

блогер
Регистрация: Jan 2010
Адрес: Киев
Сообщений: 156
Записей в блоге: 4
Отправить сообщение для ps_spectre с помощью Skype™
Убедили, назвать нормальной работой - сложно,)

Старый 04.03.2010, 22:30
chabapok вне форума Посмотреть профиль Отправить личное сообщение для chabapok Найти все сообщения от chabapok
  № 16  
Ответить с цитированием
chabapok

Регистрация: Jul 2009
Сообщений: 240
Записей в блоге: 1
тогда можно попробовать как-то так
делаем интерфейс

Код 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);


Последний раз редактировалось chabapok; 04.03.2010 в 22:50.
Старый 07.03.2010, 03:49
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 17  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
А вот кстати какая подстава:
Если в суперклассе есть два метода (не 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)))
__________________
скриптограф

Старый 07.03.2010, 22:47
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 18  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
orcpochta, предлагаю финализировать B в A.

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:34.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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