Каково значение директив повторно введения и переопределения в Delphi?

Получите учетную запись Myra Cloud. 100 ГБ.

https://myra.cloud

Вы также можете использовать Google Photos, но будьте осторожны, поскольку он будет создавать резервные копии только первых 15 ГБ в полном разрешении, а затем вы должны решить, будете ли вы уменьшать разрешение или оплачивать их обслуживание. Хуже того, если вы используете Gmail, эти 15 ГБ используются совместно с Gmail, а если вам не хватает места в Google Фото, то вы также заканчиваете в Gmail!

27
задан menjaraz 13 February 2012 в 04:53
поделиться

4 ответа

Ссылка на ответ Джима, который был превосходным, кстати, только описала, когда и где использовать директивы. Другая часть ответа - зачем они нужны? Многие языки прекрасно обходятся без них, верно? При разработке аспектов языка Delphi Object Pascal ООП (объектно-ориентированное программирование) было в мейнстриме в течение нескольких лет. В это время было замечено, что при использовании многих языков, которые приняли эти концепции (Turbo Pascal, C ++ и т. Д.) Для разработки прикладных сред, пострадала от того, что я назвал проблемой «версии 2».

Предположим, вы разработали потрясающий фреймворк, использующий язык X и выпустивший его как версию 1. Ваши пользователи были в восторге от всего, что он мог, и он стал активно использоваться. Успокойся, Вы решили выпустить версию 2 с еще большей удивительностью. Вы специально убедились, что он полностью обратно совместим. Внезапно ваши пользователи начали сообщать о странном поведении. Их собственные виртуальные методы вызывались в странные времена. Многие сообщили, что их старый код не будет компилироваться с новой версией. Странный. Все те же объекты, методы и функциональность остались. Все, что вы сделали, это добавили несколько виртуальных методов в некоторые базовые классы, несколько новых типов объектов и некоторые новые дополнительные функции. Что случилось?

Директивы override и reintroduce служат для устранения этой проблемы, требуя, чтобы для фактического override виртуального метода вы использовали директиву override вместо виртуальной директивы. Если вам случится представить свой собственный виртуальный метод, имя которого совпадает с именем одного из ваших предков виртуальные методы, компилятор теперь предупреждает вас, но все равно будет делать правильные вещи. В этом случае повторное введение не только подавляет это предупреждение, но и служит для документирования в источнике, который вы намеревались сделать.

Без директив переопределения и повторного введения вы не сможете непрерывно развивать свою структуру, не опасаясь ломая всех ваших пользователей. И если бы вашим пользователям приходилось вносить огромные изменения каждый раз, когда выпускается новая версия, они не хотели бы принимать новую версию. Наконец, использование «переопределения» также позволяет конструктору платформы изменять тип виртуального в предках, не нарушая пользовательский код. Например, в Delphi многие методы помечены как «динамические», что является формой поиска полиморфизма на основе таблицы во время выполнения. Это не он работает так же быстро, как обычный виртуальный, поэтому он обычно используется для методов, которые редко переопределяются и / или являются реакциями на действия пользователя, когда дополнительные издержки никогда не замечаются. Предположим, что в V1 фреймворка метод был помечен как «динамический», но на практике он был переопределен и вызван больше, чем вы предполагали. В V2 вы могли бы изменить его на «виртуальный», не опасаясь, что пользовательский код будет нарушен.

Язык Object Pascal в Delphi - не единственный язык, распознающий эту проблему. C # требует использования директивы override по той же самой причине. Комитет по стандартам C ++ наконец-то признает проблему и модифицирует язык для ее поддержки ... вроде. В C ++, если имя метода и список параметров совпадают с виртуальным предком, тогда это переопределение (даже если вы не говорите «виртуальный» для потомка!). Для грядущего нового стандарта C ++, если вы укажете «virtual» и сигнатуры не будут совпадать, то это новый виртуальный метод, представленный в текущем классе. Если есть совпадение подписи с предком и автор не намеревался переопределить , то ключевое слово «new» используется, чтобы сообщить компилятору, что это новый виртуальный этот класс.

46
ответ дан Allen Bauer 28 November 2019 в 04:42
поделиться

Есть много обстоятельств, когда вы не хотите вызывать унаследованные в переопределенном методе.

В некоторых библиотеках что я использую, базовый метод выдает ошибку (ENotImplimented или подобное). Очевидно, что в этом случае вы не хотите вызывать унаследованным, иначе ваш код также выдаст ошибку.

Некоторые из моих классов имеют реализацию по умолчанию, которая работает в большинстве случаев. Метод переопределяется только для замены значения по умолчанию, и нет необходимости вызывать значение по умолчанию.

Например, функция GST (= налог с продаж) в моем базовом финансовом объекте возвращает 12,5% от суммы ExGst, а IncGst возвращает ExGst + GST.

В моих объектах компенсации дохода GST всегда возвращает 0, поэтому нет необходимости вызывать унаследованную функцию.

1
ответ дан Wolf 28 November 2019 в 04:42
поделиться

Директива override используется для переопределения виртуальных методов в унаследованных классах.

reintroduce используется для объявления метода с тем же именем, что и в суперклассе, но с другими параметрами.

11
ответ дан Shannon Matthews 28 November 2019 в 04:42
поделиться

И когда мне не следует использовать унаследованное ключевое слово в переопределенных методах?

По сути, ответ таков: не хочу, чтобы унаследованный метод выполнялся. Однако будьте осторожны, так как отказ от запуска унаследованного метода может привести к нежелательному нарушению функциональности унаследованного объекта, поэтому убедитесь, что вы не вводите никаких непреднамеренных побочных эффектов.

Например, представьте, что вы хотите полностью переопределить унаследованный объект. функция называется ApplyDiscount, но кто-то жестко закодировал процент скидки в классе предков. Если вы вызываете унаследованный ApplyDiscount, он переопределит ваш код или вычислит значение, которое вы затем переопределите; в этом случае вы можете просто не звонить по наследству и применять скидку самостоятельно.

(Это надуманный пример, поэтому, если кто-то может придумать лучший вариант, добавьте его).

6
ответ дан Peter Mortensen 28 November 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: