![]() |
#1 |
MCTS
|
Можно ли запретить вызов super() в наследнике.
вот...?
|
|
![]() |
#2 |
Axapta
|
Можно.
X++: // super(); |
|
![]() |
#3 |
Участник
|
|
|
![]() |
#4 |
Участник
|
Нет.
Но думаю что-нибудь придумать типа "если имя текущего класса != базовый класс -> ошибка". |
|
![]() |
#5 |
Участник
|
|
|
![]() |
#6 |
Участник
|
Я не знаю что есть предмет вашего веселья.
Мне кажется автор темы понял о чем я, но я поясню. Человек, как я понял, хочет переопределить метод базового класса в наследнике, но так, чтобы в этом методе было запрещено вызывать super(). Добиться этого, используя средства языка AFAIK нельзя. Но можно извернуться написав на X++ что-то подобное тому, что я написал в кавычках в том самом методе в _базовом классе_. |
|
![]() |
#7 |
MCTS
|
leva, именно. Вариант, конечно, подходит, но все же хотелось бы уже на этапе компиляции. Видимо не совсем корректно, сформулировал вопрос. Имелось ввиду:
Переопределяем некий метод в наследнике, пишем в нем super() - компилятор в ответ брызжет слюной, мол, нельзя здесь так делать. Вообще говоря, как будто где-то такое вроде видел... |
|
![]() |
#8 |
Участник
|
Поставить на методе final
|
|
![]() |
#9 |
Участник
|
Цитата:
Сообщение от Eldar9x
![]() leva, именно. Вариант, конечно, подходит, но все же хотелось бы уже на этапе компиляции. Видимо не совсем корректно, сформулировал вопрос. Имелось ввиду:
Переопределяем некий метод в наследнике, пишем в нем super() - компилятор в ответ брызжет слюной, мол, нельзя здесь так делать. Вообще говоря, как будто где-то такое вроде видел... ![]() ЗЫ miklenew опередил с финалом ... ![]() |
|
![]() |
#10 |
MCTS
|
Цитата:
Поставить на методе final
|
|
![]() |
#11 |
Участник
|
final вообще запретит переопределять, это совсем не то.
Можно заставить переопределить (abstract, implements). Но разрешить переопределить, но не дать при этом вызвать можно только в runtime. |
|
|
За это сообщение автора поблагодарили: Eldar9x (1). |
![]() |
#12 |
MCTS
|
Понятно, спасибо. Получилось, что-то вроде:
X++: if (classnum(AclCalc) != classidget(this)) throw error(strfmt("@SYS68912", funcname())); Последний раз редактировалось Eldar9x; 30.04.2008 в 14:28. |
|
![]() |
#13 |
Участник
|
вопрос: а зачем это нужно?
|
|
![]() |
#14 |
MCTS
|
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. |
|
![]() |
#15 |
Участник
|
мне кажется, эти два класса должны наследоваться от третьего, который будет содержать общее поведение для них
|
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|