25.05.2004, 09:06 | #1 |
Участник
|
как вызвать метод "деда" ?
например
X++: class A { void insert(); } class B extends A class C extends B |
|
25.05.2004, 10:14 | #2 |
Участник
|
super();
|
|
25.05.2004, 10:15 | #3 |
Участник
|
вызвав super() из C::insert() я вызову B::insert()
а мне нужен A::insert() |
|
25.05.2004, 11:46 | #4 |
Участник
|
to Omeo:
PHP код:
С другой стороны, если Вам не нужны свойства класса B, зачем от него наследовать C? Может лучше рассказать первичную задачу. |
|
25.05.2004, 11:48 | #5 |
Участник
|
потому что нужна вся функциональность B кроме метода insert ( ну и пары других методов )
|
|
25.05.2004, 11:53 | #6 |
Участник
|
Если переопределен метод на B, то в C его никак нельзя вызвать. Нужно классы проектировать по другому.
|
|
25.05.2004, 11:58 | #7 |
Участник
|
[Закидано помидорами]
__________________
Здесь могла быть Ваша реклама! |
|
25.05.2004, 12:00 | #8 |
Участник
|
Так может проще эти пару метов & insert вынести
в отдельный класс и не греть голову class A - базовый class B - расширение функций class C & D со своими insert-ами |
|
25.05.2004, 12:19 | #9 |
1C
|
Цитата:
Изначально опубликовано Omeo
вызвав super() из C::insert() я вызову B::insert() а мне нужен A::insert() |
|
25.05.2004, 14:06 | #10 |
Участник
|
вот именно что в В::insert() выполняются действия которые мне не нужны, а super() там конечно есть
все равно, спасибо всем за помощь |
|
26.05.2004, 10:59 | #11 |
Пенсионер
|
Используй флаги - например переменную в классе "А", а в классе "С" устанавливай нужное значение, которое анализируется в классе "В" и направляет свой insert() по нужному тебе пути.
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|
26.05.2004, 11:03 | #12 |
Участник
|
Цитата:
Изначально опубликовано Oz
PHP код:
Грубо конечно, но ничего другого в голову не приходит. В методе class A::insertFromA() { insert(); вызовется метод insert ПОТОМКА, то есть класса С но уж никак не А. Если конечно мы говорим об экземпляре(объекте) созданном на основании класса С. 2. Ошибки в синтаксисе. перед вызовом метода необходимо указывать контекст. то есть нужно написать this.insert(); 3. Зачем переопределять метод insertFromA на С если там вызывается просто супер? 4. Если в коде УЖЕ используется вызов метода insert? Вы предлагаете переписать весь код? А если нам нужно использовать этот код не только для экземпляров класса С? Абсолютно бессмысленный пример-совет. Господа. Прежде чем давать советы, сначала может быть проверите то, что советуете сами? А потом уже будете садиться в лужу? |
|
26.05.2004, 11:08 | #13 |
Участник
|
Цитата:
Изначально опубликовано blokva
Используй флаги - например переменную в классе "А", а в классе "С" устанавливай нужное значение, которое анализируется в классе "В" и направляет свой insert() по нужному тебе пути. Но, к сожалению, придется трогать класс В для целей класса С... что не очень хорошо. :( |
|
26.05.2004, 11:08 | #14 |
Участник
|
PHP код:
|
|
26.05.2004, 11:15 | #15 |
Пенсионер
|
Цель определяет средства!
Можешь создать класс "D" наследник "A" но с функциональностью "B" + "C" - "то, что не нужно" из "B"!
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|
26.05.2004, 11:22 | #16 |
Участник
|
Приведение по-аксаптовскию Выглядит дико, но работает
PHP код:
|
|
26.05.2004, 11:28 | #17 |
Участник
|
Цитата:
Изначально опубликовано blokva
Цель определяет средства! Можешь создать класс "D" наследник "A" но с функциональностью "B" + "C" - "то, что не нужно" из "B"! - убрать оттуда перекрытый метод - сделать B наследником X - убрать из B все, кроме перекрытого метода - С наследовать из X |
|
26.05.2004, 12:12 | #18 |
Дмитрий Ерин
|
Цитата:
Изначально опубликовано Lexey
Приведение по-аксаптовскию Выглядит дико, но работает PHP код:
В Вашем примере вызовется метод класса С (то есть рекурсия) и произойдет переполнение стека. ded = this приводит к тому, что дед становится внуком. Это в дебаггере хорошо видно (хоть и странновато). У переменной ded после такого присвоения Type будет указывать по-прежнему на А, но Value покажет new, C. Или я Вас неправильно понял? Так как же все-таки работает приведение (пусть даже дикое)? Остальные предложенные варианты вполне очевидны... Но, интересно, кто-нибудь думал о варианте, когда классы А и В - системные? По-моему, нерешаемо... Кто как думает?
__________________
|
|
26.05.2004, 13:55 | #19 |
Участник
|
ОК, не работает. Хотя в другую сторону по иерархии все проходит.
Делаем так. PHP код:
PHP код:
|
|
26.05.2004, 14:05 | #20 |
Участник
|
Цитата:
Но, интересно, кто-нибудь думал о варианте, когда классы А и В - системные?
как ниболее быстрое решение сделал копию В |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|