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

Diestro 10.10.2008 14:41

Вызов переопределенного метода у родителя родителя
 
Есть класс A, который определяет метод someMethod. И в нем определен жизненно важный функционал:
Код:

public class A {
//--------------------------
    public function someMethod():void{
          //жизненно важный функционал
    }
}

Есть класс B, который наследуется от A и переопределяет метод someMethod, вызывающий someMethod родителя и добавляя в него свой, ненужный нам функционал:
Код:

public class B extends A {
//--------------------------
    override public function someMethod():void{
          super.someMethod();
          //ненужный нам функционал
    }
}

Предположим Классы A и B это классы flex sdk и изменять их нельзя.

Задача:
Отнаследоваться от класса B, переопределить someMethod, но вызвать someMethod класса A, так как в someMethod класса B реализован ненужный нам функционал и добавить свой.
Код:

public class C extends B {
//--------------------------
    override public function someMethod():void{
          ??? superOfClassA.someMethod();
          //мой функционал
         
    }
}

Upd:
Я могу привести конкретный пример. Доводя до ума компонент AutoComplete, найденый на Adobe Flex Exchange оказалось что в нем существует ряд багов, которые захотелось исправить. Все что хотел исправил, но вылез баг, зарытый в классе ComboBox, от которого наследуется компонент AutoComplete. ComboBox в свою очередь наследуется от ComboBase.
Баг спрятан в функции updateDisplayList компонента ComboBox которая переопределяется из самых недр наследования. Здесь есть строка:
Код:

textInput.getTextField().setSelection(0, textInput.text.length);
которая собственно выделяет в определенный момент весь текст, находящийся внутри текстового поля этого компонента, потом сбрасывая выделение. Если это делать в "чистом проекте" то все в порядке, но если флэшка подзагружена или не очень быстрый компьютер, то при очень быстром вводе текста - выделеный текст стирается и бывает так что в текстовом поле остается только часть "наскоро" введенного текста.
updateDisplayList - жизненно необходимая функция и тем более в компоненте AutoComplete добавляется дополнительная функциональность. А вот функционал в ComboBox хотелось бы переделать и переопределить updateDisplayList именно его родителя.

Вопрос: насколько это возможно и какие есть выходы из данной ситуации?

terbooter 10.10.2008 15:00

Насколько я помню, никак такое не сделать.
И это правильно.
Представляю какая каша началась бы была возможность переопределять
метод 0супер-1супер-...nсупер класса

smilenka 10.10.2008 16:50

А нельзя использовать агрегацию ? и вызывать метод объекта-экземпляра нужного вам класса A или B, притом что объект является членом вашего класса C.

Diestro 10.10.2008 18:04

Агрегация не подойдет. Например someMethod это реализация метода invalidateDisplayList() и хотелось бы чтобы все вызовы этого метода реализовывал класс C, без разницы из недр какого из родителей он был вызван.

Diestro 12.10.2008 13:50

Неужели ни у кого больше нету идей. Неужели все выходят из положения переносом класса из flex sdk в папку проекта, чтобы убрать ненужный код?

enepx 12.10.2008 16:45

мне кажется Вам подойдет перепроектирование проекта (извиняюсь за игру слов). что-то тут не так )

7thsky™ 12.10.2008 17:17

Скорее всего не обойти. Как правило (в таких случаях) в классе C переопределяется метод и туда просто копируется содержимое того же метода из класса A (без копирования всего сдк).

нда... вообще интересно есть ли более правильное решение

Diestro 12.10.2008 18:41

Я могу привести конкретный пример. Т.е. описать где именно я с этим столкнулся. Доводя до ума компонент AutoComplete, найденый на Adobe Flex Exchange оказалось что в нем существует ряд багов, которые захотелось исправить. Все что хотел исправил но вылез баг, зарытый в классе ComboBox, от которого наследуется компонент AutoComplete. ComboBox в свою очередь наследуется от ComboBase.
Баг спрятан в функции updateDisplayList компонента ComboBox которая переопределяется из самых недр наследования. Здесь есть строка:
Код:

textInput.getTextField().setSelection(0, textInput.text.length);
которая собственно выделяет в определенный момент весь текст, находящийся внутри текстового поля этого компонента, потом сбрасывая выделение. Если это делать в "чистом проекте" то все в порядке, но если флэшка подзагружена или не очень быстрый компьютер, то при очень быстром вводе текста - выделеный текст стирается и бывает так что в текстовом поле остается только часть "наскоро" введенного текста.
updateDisplayList - жизненно необходимая функция и тем более в компоненте AutoComplete добавляется дополнительная функциональность. А вот функционал в ComboBox хотелось бы переделать и переопределить updateDisplayList именно его родителя.

wvxvw 12.10.2008 18:49

Можешь попробовать поискать метод типа $invalidateDisplayList, так вобщем-то принято называть метод, если он должен експонировать родительский метод, при том, что этот же класс его оверрайдит. Ну, а если такого нету... ну не знаю, зависит от того на сколько проект должен быть совместим / поддерживаться дальше другими разработчиками и т.п. Если вы единственный его разработчик - я бы не заморачивался и просто дописал сам этот $... метод к нужному классу, а если нет - ну, тогда, как уже сказали, только самому взять и переписать...

Diestro 14.10.2008 11:42

Цитата:

Сообщение от 7thsky™ (Сообщение 769799)
Скорее всего не обойти. Как правило (в таких случаях) в классе C переопределяется метод и туда просто копируется содержимое того же метода из класса A (без копирования всего сдк).

нда... вообще интересно есть ли более правильное решение

Ну это при условии что класс A является самым верхним в родительской иерархии. А если будет большая глубина наследования то и копировать прийдется последовательно кучу кода из всех родителей метода updateDisplayList().

Цитата:

Сообщение от wvxvw (Сообщение 769822)
Можешь попробовать поискать метод типа $invalidateDisplayList, так вобщем-то принято называть метод, если он должен експонировать родительский метод, при том, что этот же класс его оверрайдит. Ну, а если такого нету... ну не знаю, зависит от того на сколько проект должен быть совместим / поддерживаться дальше другими разработчиками и т.п. Если вы единственный его разработчик - я бы не заморачивался и просто дописал сам этот $... метод к нужному классу, а если нет - ну, тогда, как уже сказали, только самому взять и переписать...

Естественно нужного метода через значок $ там не оказалось :D


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

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