![]() |
Недопонимание перекрытия методов суперкласса
Есть СуперКласс и НаследникКласс.
СуперКласс определяет метод testMethod( ), а НаследникКласс его переопределяет. Могу ли я как-то вызвать над экземпляром класса НаследникКласс непереопределенный метод testMethod( ) класса СуперКласс? т.е. экземплярНаследникКласс.testMethod( ) - вызывается переопределенный метод а экземплярНаследникКласс.что-то-как-то.testMethod( ) - вызывает непереопределенный метод. Мне казалось, что должно сработать через приведение: СуперКласс(экземплярНаследникКласс).testMethod( ) Но это не работает, а так хотелось))) |
в НаследникКласс нужно вызвать super.testMethod() - это и будет непереопределенный метод СуперКласс'а
|
Цитата:
|
Цитата:
Хотите иметь два разных, сделайте в наследнике другой метод где и будет переопределенный код. |
ну если через namespace, а может и не получится..
|
Цитата:
Для примера возьмем toString( ). Есть стандартный toString( ) для Object. Для нашего класса определим свой toString( ), для подкласса тоже свой и т.д. Получаем, что для одного экземпляра можно было бы вызывать любой toString( ) через приведение: trace(instance); trace(SuperClass(instance)); trace(Object(instance)); Живой пример: Есть класс, представляющий структуру данных, например, таблицу - Table. Метод toString( ) делает строку из элементов этой таблицы. Есть расширяющий класс субтаблица (фрагмент таблицы) SubTable - по сути та же таблица, хранящая вместо элементов или значений ссылки (индексы) на ячейки основной таблицы, т.е., работая с субтаблицей, мы по сути работаем с исходной таблицей, но только в окрестностях, ограниченных нашей субтаблицей. В классе SubTable, если не переопределять toString( ), будет получаться строка ссылочных индексов на исходную таблицу, но логично будет его переопределить так, чтобы выдавалась строка конечных значений таблицы в окрестности субтаблицы. Тогда мы могли бы выводить значения ячеек субтаблицы через trace(subtable); а саму фактическую таблицу (т.е. таблицу индексов, ссылающихся на исходную таблицу, через которые описывается связь субтаблицы и примарной таблицы) через trace(Table(subtable)); Красиво же))) |
Это на виртуальные методы по описанию похоже. В AS3 хоть и есть ключевое слово virtual, только вот оно не работает. В википедии про виртуальные функции написано и в инете есть примеры на AS3, где они не работают.
|
Хм, а если явно указать класс, которым итерпретировать объект. Не гарантирую что выйдет, но попробуйте так:
(obj as SupserClass).superClassMethod(); (obj as SuperUnderSuperClass).superClassMethod(); и тд. |
[offtop]
Код AS3:
|
Цитата:
мне по крайней мере видится так (: |
Цитата:
|
Цитата:
|
Цитата:
компилируется - это еще не значит работает убрать модификатор virtual и разве что-то изменится? |
На уровне байткода можно создать виртуальную функцию - только оно вам надо? :)
|
Убедили, назвать нормальной работой - сложно,)
|
тогда можно попробовать как-то так
делаем интерфейс Код AS3:
Код AS3:
Код AS3:
последний вариант рабочий если в сравнении написать так: if (prototype != NeedClass.prototype) return super.myfunc(NeedClass); |
А вот кстати какая подстава:
Если в суперклассе есть два метода (не private), один из которых вызывается другим: Код AS3:
Код AS3:
или есть какой-то способ указать, что А должен вызвать B суперкласса, а не B класса-наследника? может как-то через пространства имен? P.S. сейчас придет многоуважаемый iNils и скажет, что надо называть методы разными именами, а override - он на то и override))) |
orcpochta, предлагаю финализировать B в A.
|
| Часовой пояс GMT +4, время: 12:50. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.