Почему назван деструктор в Delphi?

деструкторы в Delphi обычно называются "уничтожить", однако, насколько я понимаю, вы также можете

  • имя деструкторы по-разному
  • иметь несколько деструкторов

есть ли причина, почему это было реализовано таким образом? Каковы возможные варианты использования для разных именованных / нескольких деструкторов?

1 ответов


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

кроме того, поскольку язык Object Pascal не имеет этих магических операций new/delete, должен быть какой-то идентификатор для вызова удаления объекта.

Я бы предпочел посмотреть на это в ретроспективе.

"Turbo Pascal с объектами" объекты стиля имеют оба-вы вызываете "волшебный" Dispose процедура, но явно указать деструктор для вызова, так как сам язык не знал, что выбрать. Аналогичная "волшебная" процедура New должен был поставляться с выбранным вручную конструктор.

это, однако, нарушает сухой принцип: компилятор знает, что мы вызываем 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.