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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.04.2008, 13:00   #1  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Можно ли запретить вызов super() в наследнике.
вот...?
Старый 30.04.2008, 13:07   #2  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Можно.
X++:
// super();
Каков вопрос, таков и ответ.
__________________
С уважением,
Олег.
Старый 30.04.2008, 13:08   #3  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
вот...?
А почему нет.
Скоко раз так делал.
Если вам это действительно надо.
Старый 30.04.2008, 13:08   #4  
leva is offline
leva
Участник
 
52 / 36 (2) +++
Регистрация: 03.08.2005
Нет.

Но думаю что-нибудь придумать типа "если имя текущего класса != базовый класс -> ошибка".
Старый 30.04.2008, 13:16   #5  
Daiver is offline
Daiver
Участник
Самостоятельные клиенты AX
 
177 / 44 (2) +++
Регистрация: 19.07.2005
Адрес: Москва
Цитата:
Сообщение от leva Посмотреть сообщение
Нет.

Но думаю что-нибудь придумать типа "если имя текущего класса != базовый класс -> ошибка".
Это чего, "пятничный" отжиг чтоли?
Старый 30.04.2008, 13:22   #6  
leva is offline
leva
Участник
 
52 / 36 (2) +++
Регистрация: 03.08.2005
Цитата:
Сообщение от Daiver Посмотреть сообщение
Это чего, "пятничный" отжиг чтоли?
Я не знаю что есть предмет вашего веселья.

Мне кажется автор темы понял о чем я, но я поясню.

Человек, как я понял, хочет переопределить метод базового класса в наследнике, но так, чтобы в этом методе было запрещено вызывать super(). Добиться этого, используя средства языка AFAIK нельзя. Но можно извернуться написав на X++ что-то подобное тому, что я написал в кавычках в том самом методе в _базовом классе_.
Старый 30.04.2008, 13:50   #7  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
leva, именно. Вариант, конечно, подходит, но все же хотелось бы уже на этапе компиляции. Видимо не совсем корректно, сформулировал вопрос. Имелось ввиду:
Переопределяем некий метод в наследнике, пишем в нем super() - компилятор в ответ брызжет слюной, мол, нельзя здесь так делать. Вообще говоря, как будто где-то такое вроде видел...
Старый 30.04.2008, 13:56   #8  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Поставить на методе final
Старый 30.04.2008, 14:01   #9  
Daiver is offline
Daiver
Участник
Самостоятельные клиенты AX
 
177 / 44 (2) +++
Регистрация: 19.07.2005
Адрес: Москва
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
leva, именно. Вариант, конечно, подходит, но все же хотелось бы уже на этапе компиляции. Видимо не совсем корректно, сформулировал вопрос. Имелось ввиду:
Переопределяем некий метод в наследнике, пишем в нем super() - компилятор в ответ брызжет слюной, мол, нельзя здесь так делать. Вообще говоря, как будто где-то такое вроде видел...
Ясно. Но возможно это ошибка проектирования иерархии классов? Можно же сделать метод final ... Если не делать финал то конечно есть вероятность что программер который не знает вашего класса отнаследует его и вызовет супер, ... Вообще както странно выглядит задача ...

ЗЫ miklenew опередил с финалом ...
Старый 30.04.2008, 14:02   #10  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Поставить на методе final
final вообще не даст перекрывать метод.
Старый 30.04.2008, 14:04   #11  
leva is offline
leva
Участник
 
52 / 36 (2) +++
Регистрация: 03.08.2005
final вообще запретит переопределять, это совсем не то.
Можно заставить переопределить (abstract, implements).
Но разрешить переопределить, но не дать при этом вызвать можно только в runtime.
За это сообщение автора поблагодарили: Eldar9x (1).
Старый 30.04.2008, 14:26   #12  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Понятно, спасибо. Получилось, что-то вроде:
X++:
    if (classnum(AclCalc) != classidget(this))
        throw error(strfmt("@SYS68912", funcname()));

Последний раз редактировалось Eldar9x; 30.04.2008 в 14:28.
Старый 30.04.2008, 14:32   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
вопрос: а зачем это нужно?
Старый 30.04.2008, 14:38   #14  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
X++:
:    ?
Есть родитель у которого в методе инициализируются его элементы, в наследнике должна инициализироваться только часть этих элементов и плюс еще элементы наследника.

Родитель:
X++:
protected void initDlgFields()
{
    ;
    if (classnum(AclCalc) != classidget(this))
        throw error(strfmt("@SYS68912", funcname()));

    dfDistrId       = dialog.addFieldValue(typeId(AclDistrId),  this.parmDistrId(),     "@ACL3");
    dfCalcPeriod    = dialog.addFieldValue(typeId(DateCode),    this.parmCalcPeriod(),  "@SYS60051", '', 'dfCalcPeriod');
    dfStartDate     = dialog.addFieldValue(typeId(TransDate),   this.parmStartDate(),   "@SYS5209");
    dfEndDate       = dialog.addFieldValue(typeId(TransDate),   this.parmEndDate(),     "@SYS80662");

    dfDistrId.mandatory(true);
    dfCalcPeriod.mandatory(false);
    dfStartDate.mandatory(true);
    dfEndDate.mandatory(true);
}
Наследник:
X++:
protected void initDlgFields()
{
    ;
    if (classnum(AclCalcClose) != classidget(this))
        throw error(strfmt("@SYS68912", funcname()));

    dfJournalId     = dialog.addFieldValue(typeId(LedgerJournalNameId), this.parmJournalId(), "@SYS24042");
    dfAlgId         = dialog.addFieldValue(typeId(AclAlgId), this.parmAlgId());

    dfCalcPeriod    = dialog.addFieldValue(typeId(DateCode),    this.parmCalcPeriod(),  "@SYS60051", '', 'dfCalcPeriod');
    dfStartDate     = dialog.addFieldValue(typeId(TransDate),   this.parmStartDate(),   "@SYS5209");
    dfEndDate       = dialog.addFieldValue(typeId(TransDate),   this.parmEndDate(),     "@SYS80662");

    dfJournalId.mandatory(true);
    dfAlgId.mandatory(true);

    dfCalcPeriod.mandatory(false);
    dfStartDate.mandatory(true);
    dfEndDate.mandatory(true);
}

       ,      .

Последний раз редактировалось Eldar9x; 30.04.2008 в 14:42.
Старый 30.04.2008, 15:08   #15  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
мне кажется, эти два класса должны наследоваться от третьего, который будет содержать общее поведение для них
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вызов метода element.args().caller().setOfficialsParams(.... Poleax DAX: Программирование 6 04.09.2008 19:49
Вызов метода базового класса Eldar9x DAX: Программирование 15 22.03.2008 19:10
Книга Покупок можно ли не закрывать? asabin DAX: Функционал 1 18.11.2005 17:50
Можно ли в инамическом запросе использовать "group by"? yooshi DAX: Программирование 26 23.09.2005 16:35
Можно ли поменять налоговый код по проведенной закупке или накладной поставщика Голова 2уха DAX: Функционал 1 25.10.2004 11:51

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:49.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.