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