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