![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
[offtop]
см след. страницу. )class Foo extends Object { public virtual function Test():void { trace("Foo.Test()"); } } class Bar extends Foo { public override function Test():void { trace("Bar.Test()"); } } class Biz extends Bar { public override function Test():void { trace("Biz.Test()"); } } ==== var f:Foo = new Foo(); f.Test(); f = new Bar(); f.Test(); f = new Biz(); f.Test(); Последний раз редактировалось ps_spectre; 04.03.2010 в 20:05. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Не работают, нет эксепшена о том, что метод не переопределен.
|
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
Цитата:
компилируется - это еще не значит работает убрать модификатор virtual и разве что-то изменится?
__________________
скриптограф |
|
|||||
|
тогда можно попробовать как-то так
делаем интерфейс 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 прадедушки 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() function myfunc(NeedClass){ if (super is NeedClass) renturn super.myfunc(NeedClass); блаблабла;//код на текущем уровне вложенности } последний вариант рабочий если в сравнении написать так: if (prototype != NeedClass.prototype) return super.myfunc(NeedClass); Последний раз редактировалось chabapok; 04.03.2010 в 22:50. |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
А вот кстати какая подстава:
Если в суперклассе есть два метода (не private), один из которых вызывается другим: public function A ( ):void { B( ); } public function B ( ):void { trace("SuperClass, function B"); } то связка методов "A суперкласса вызывает B суперкласса" становится недоступна из класса наследника, а получаем "А суперкласса вызывает B класса-наследника" (что рушит логическую цепочку ф-ий и приводит к непредсказуемым последствиям) или есть какой-то способ указать, что А должен вызвать B суперкласса, а не B класса-наследника? может как-то через пространства имен? P.S. сейчас придет многоуважаемый iNils и скажет, что надо называть методы разными именами, а override - он на то и override)))
__________________
скриптограф |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
orcpochta, предлагаю финализировать B в A.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 12:42. |
|
|
« Предыдущая тема | Следующая тема » |
|
|