Почему назван деструктор в Delphi?
деструкторы в Delphi обычно называются "уничтожить", однако, насколько я понимаю, вы также можете
- имя деструкторы по-разному
- иметь несколько деструкторов
есть ли причина, почему это было реализовано таким образом? Каковы возможные варианты использования для разных именованных / нескольких деструкторов?
1 ответов
теоретически вы можете вручную вызывать различные деструкторы для освобождения различных внешних ресурсов, таких как разрыв циклов подсчета ссылок, удаление или просто закрытие файла и т. д.
кроме того, поскольку язык Object Pascal не имеет этих магических операций new/delete, должен быть какой-то идентификатор для вызова удаления объекта.
Я бы предпочел посмотреть на это в ретроспективе.
"Turbo Pascal с объектами" объекты стиля имеют оба-вы вызываете "волшебный" Dispose
процедура, но явно указать деструктор для вызова, так как сам язык не знал, что выбрать. Аналогичная "волшебная" процедура New
должен был поставляться с выбранным вручную конструктор.
- http://www.freepascal.org/docs-html/rtl/system/dispose.html
- http://putka.acm.si/langref/turboPascal/0547.html
- http://www.freepascal.org/docs-html/rtl/system/new.html
- http://putka.acm.si/langref/turboPascal/04A4.html
это, однако, нарушает сухой принцип: компилятор знает, что мы вызываем d-tor или c-tor, но все же мы должны дополнительно называть эти функции "новыми" и "утилизировать". Теоретически это, вероятно, позволило бы разделить выделение памяти и подачу информации и объединить их в любом случае. Но я не думаю, что эта функция действительно использовалась широко.
интересно, что тот же дизайн используется в Apple Objective C. Вы 1st выделяете память для объекта, а после этого вызываете конструктор для этого нового экземпляра: http://en.wikipedia.org/wiki/Objective-C#Instantiation
когда эта модель была оптимизирована для Delphi, было принято несколько решений, чтобы сделать вещи более упрощенными (и унифицированными). Стратегия выделения памяти [de] была перенесена на уровень класса, а не на сайт вызова. Это сделало избыточность как вызова "New", так и именованного конструктора очень контрастной. Одного пришлось бросить.
C++ / C# / Java выбран для сохранения специальных ключевых слов на уровне языка для него, используя перегруженные функции для обеспечения различных c-ТОРов. Возможно, это соответствует стилю компьютерных языков США.
однако Паскаль в своей основе имеет две идеи: многословие и небольшой словарный запас. Возможно, их можно отслеживать на других европейских языках, таких как Scala. По возможности ключевые слова следует удалить из самого языка и переместить во внешние модули-библиотеки, которые можно добавить или удалить из проекта. А перегруженные функции были введены гораздо позже в язык и в начале предпочтение отдавалось, конечно, есть два с разными именами (самодокументирование) имена функций.
это обе идеи, вероятно, заставили Delphi удалить" магические " процедуры и вывести создание/уничтожение объекта на сайте вызовов только по используемым именам функций. Если вы позвоните MyVar.Destroy
затем компилятор смотрит на объявление .Destroy
и знает, что мы удаляем объект. Точно так же он знает TMyType.CreateXXX(YYY,ZZZ)
является объектом instanbtiation из-за пути CreateXXX
была объявлена.
сделать c-tor и D-tor без имени, как в C++, Delphi придется ввести еще два ключевых слова на уровень языка, например, C++ new
и delete
. И в этом нет явного преимущества. По крайней мере, лично мне больше нравится Delphi way.
PS. Я должен был добавить туда одно предположение: мы говорим о реальных языках C++ и Delphi, как они были около 1995 года. В них было только ручное управление памятью для объектов, выделенных кучей, без сбора мусора и автоматического подсчета ссылок. Невозможно вызвать уничтожение объекта, назначив переменную с указателем nil/NULL.