AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.05.2004, 09:06   #1  
Omeo is offline
Omeo
Участник
 
129 / 50 (2) ++++
Регистрация: 18.03.2004
Адрес: Moscow
? как вызвать метод "деда" ?
например

X++:
class A
{
  void insert();
}

class B extends A
class C extends B
как из метода C::insert вызвать A::insert ?
Старый 25.05.2004, 10:14   #2  
kalex is offline
kalex
Участник
 
132 / 20 (1) +++
Регистрация: 18.05.2002
Адрес: Москва
super();
Старый 25.05.2004, 10:15   #3  
Omeo is offline
Omeo
Участник
 
129 / 50 (2) ++++
Регистрация: 18.03.2004
Адрес: Moscow
вызвав super() из C::insert() я вызову B::insert()
а мне нужен A::insert()
Старый 25.05.2004, 11:46   #4  
kaw is offline
kaw
Участник
 
122 / 35 (2) +++
Регистрация: 23.03.2004
Адрес: Новосибирск
to Omeo:
PHP код:
вызвав super() из C::insert() я вызову B::insert() 
Если в классе B переопределен insert()

С другой стороны, если Вам не нужны свойства класса B,
зачем от него наследовать C?
Может лучше рассказать первичную задачу.
Старый 25.05.2004, 11:48   #5  
Omeo is offline
Omeo
Участник
 
129 / 50 (2) ++++
Регистрация: 18.03.2004
Адрес: Moscow
потому что нужна вся функциональность B кроме метода insert ( ну и пары других методов )
Старый 25.05.2004, 11:53   #6  
kalex is offline
kalex
Участник
 
132 / 20 (1) +++
Регистрация: 18.05.2002
Адрес: Москва
Если переопределен метод на B, то в C его никак нельзя вызвать. Нужно классы проектировать по другому.
Старый 25.05.2004, 11:58   #7  
Oz is offline
Oz
Участник
Аватар для Oz
 
293 / 51 (2) ++++
Регистрация: 22.08.2002
Адрес: Москва
[Закидано помидорами]
__________________
Здесь могла быть Ваша реклама!
Старый 25.05.2004, 12:00   #8  
kaw is offline
kaw
Участник
 
122 / 35 (2) +++
Регистрация: 23.03.2004
Адрес: Новосибирск
Так может проще эти пару метов & insert вынести
в отдельный класс и не греть голову

class A - базовый
class B - расширение функций
class C & D со своими insert-ами
Старый 25.05.2004, 12:19   #9  
YVAS is offline
YVAS
1C
Аватар для YVAS
1C
 
265 / 10 (1) +
Регистрация: 31.07.2003
Цитата:
Изначально опубликовано Omeo
вызвав super() из C::insert() я вызову B::insert()
а мне нужен A::insert()
если не удаляли вызов super() в классе В, то он и вызовет ваш insert() класса А
Старый 25.05.2004, 14:06   #10  
Omeo is offline
Omeo
Участник
 
129 / 50 (2) ++++
Регистрация: 18.03.2004
Адрес: Moscow
вот именно что в В::insert() выполняются действия которые мне не нужны, а super() там конечно есть

все равно, спасибо всем за помощь
Старый 26.05.2004, 10:59   #11  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Используй флаги - например переменную в классе "А", а в классе "С" устанавливай нужное значение, которое анализируется в классе "В" и направляет свой insert() по нужному тебе пути.
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
Старый 26.05.2004, 11:03   #12  
ta_and is offline
ta_and
Участник
 
226 / 122 (5) +++++
Регистрация: 26.02.2002
Адрес: СПб
Цитата:
Изначально опубликовано Oz
PHP код:
class A::insertFromA()
{
    
insert();
}

class 
C::insertFromA()
{
    
super();

Это если конечно можно модифицировать class A...
Грубо конечно, но ничего другого в голову не приходит.
1. Абсолютное незнание принципов ООП.
В методе
class A::insertFromA()
{
insert();
вызовется метод insert ПОТОМКА, то есть класса С но уж никак не А.
Если конечно мы говорим об экземпляре(объекте) созданном на основании класса С.

2. Ошибки в синтаксисе.
перед вызовом метода необходимо указывать контекст.
то есть нужно написать
this.insert();

3. Зачем переопределять метод insertFromA на С если там вызывается просто супер?

4. Если в коде УЖЕ используется вызов метода insert? Вы предлагаете переписать весь код? А если нам нужно использовать этот код не только для экземпляров класса С?

Абсолютно бессмысленный пример-совет.

Господа.
Прежде чем давать советы, сначала может быть проверите то, что советуете сами?
А потом уже будете садиться в лужу?
Старый 26.05.2004, 11:08   #13  
ta_and is offline
ta_and
Участник
 
226 / 122 (5) +++++
Регистрация: 26.02.2002
Адрес: СПб
Цитата:
Изначально опубликовано blokva
Используй флаги - например переменную в классе "А", а в классе "С" устанавливай нужное значение, которое анализируется в классе "В" и направляет свой insert() по нужному тебе пути.
Да. Похоже это выход из данной ситуации.
Но, к сожалению, придется трогать класс В для целей класса С... что не очень хорошо. :(
Старый 26.05.2004, 11:08   #14  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
PHP код:
// дед
class GrandFather
{
         
void insert()
         {
                
this.insertSpecialGrandFatherWay();
         }
         final protected 
void insertSpecialGrandFatherWay()
         {
               
// то, что раньше было в insert
         
}
}
// отец остается как был
class Father extends   GrandFather
{
}
// внук
class GrandSon extends Father {
         
void insert()
         {
                
this.insertSpecialGrandFatherWay();
         }    

Старый 26.05.2004, 11:15   #15  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Цель определяет средства!
Можешь создать класс "D" наследник "A" но с функциональностью "B" + "C" - "то, что не нужно" из "B"!
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
Старый 26.05.2004, 11:22   #16  
Lexey is offline
Lexey
Участник
 
59 / 13 (1) ++
Регистрация: 16.05.2002
Приведение по-аксаптовскию Выглядит дико, но работает
PHP код:
class C()
{
void insert()
{
    
A   ded;
    ;
    
ded this;
    if (
ded)
        
ded.insert();
}       

Такие вызовы - явная ошибка дизайна. Надо делать как belugin написал.
Старый 26.05.2004, 11:28   #17  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Изначально опубликовано blokva
Цель определяет средства!
Можешь создать класс "D" наследник "A" но с функциональностью "B" + "C" - "то, что не нужно" из "B"!
- создать класс X - копию B
- убрать оттуда перекрытый метод
- сделать B наследником X
- убрать из B все, кроме перекрытого метода
- С наследовать из X
Старый 26.05.2004, 12:12   #18  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Изначально опубликовано Lexey
Приведение по-аксаптовскию Выглядит дико, но работает
PHP код:
class C()
{
void insert()
{
    
A   ded;
    ;
    
ded this;
    if (
ded)
        
ded.insert();
}       

Такие вызовы - явная ошибка дизайна. Надо делать как belugin написал.
Дык, в том то и дело, что не работает . Совсем недавно столкнулся...
В Вашем примере вызовется метод класса С (то есть рекурсия) и произойдет переполнение стека. ded = this приводит к тому, что дед становится внуком. Это в дебаггере хорошо видно (хоть и странновато). У переменной ded после такого присвоения Type будет указывать по-прежнему на А, но Value покажет new, C.
Или я Вас неправильно понял? Так как же все-таки работает приведение (пусть даже дикое)?

Остальные предложенные варианты вполне очевидны... Но, интересно, кто-нибудь думал о варианте, когда классы А и В - системные? По-моему, нерешаемо... Кто как думает?
__________________
Старый 26.05.2004, 13:55   #19  
Lexey is offline
Lexey
Участник
 
59 / 13 (1) ++
Регистрация: 16.05.2002
ОК, не работает. Хотя в другую сторону по иерархии все проходит.

Делаем так.
PHP код:
class A()
{
public 
void new(A templ null)
{
   ;
   if (
templ)
       
this templ;
}

и так
PHP код:
class C()
{
void insert()
{
    
A ded;
    ;
   
   
ded = new A(this);
   
ded.insert();
}

Шаманство это все. Архитектуру классов надо продумывать
Старый 26.05.2004, 14:05   #20  
Omeo is offline
Omeo
Участник
 
129 / 50 (2) ++++
Регистрация: 18.03.2004
Адрес: Moscow
Цитата:
Но, интересно, кто-нибудь думал о варианте, когда классы А и В - системные?
вот как раз в моем случае A - системный, В - класс, который менять не рекомендуется
как ниболее быстрое решение сделал копию В
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как вызвать метод для поля в FormDataSource? Maxim Gorbunov DAX: Программирование 3 08.05.2007 11:28
Есть стандартный метод который возвращал бы пустую складскую аналитику т.е. "Axapta"? Hidden DAX: Функционал 8 30.05.2006 14:44
Как вызвать нужный метод класса? Pawlik DAX: Программирование 5 12.01.2006 15:47
Вопрос совсем "зеленый". Куда приткнуть метод? Hobo DAX: Программирование 3 13.02.2004 18:07
Как вызвать метод на COMVariant? Andronov DAX: Программирование 2 06.08.2003 08:29

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:15.