Каковы различия между реализацией интерфейсов в Delphi и Lazarus (FPC)? - PullRequest
7 голосов
/ 07 марта 2012

У нас есть проект, полный пользовательских компонентов, которые сегодня работают в Lazarus и Delphi.

Я думаю об интерфейсах кода на нем, но я не очень знаком с ними. Я хотел бы знать следующее: каковы нюансы реализации интерфейсов Delphi и Lazarus? Есть что-то, о чем я должен быть в курсе? Придется ли мне кодировать действительно разные вещи?

Исходное объяснение: Я думаю, что компоненты могли бы извлечь выгоду из интерфейсов, или, по крайней мере, я узнаю больше от них. Например, один из компонентов осуществляет связь со многими различными аппаратными средствами, используя последовательный порт. Но пользователь должен использовать только наш компонент для создания приложения. Таким образом, у нас есть компонент и один класс для каждого из этих аппаратных средств, которые происходят от базового класса. Во время выполнения мы создаем определенный класс внутри компонента.

Не уверен, что это последнее объяснение было необходимо, но я могу написать больше, если кому-то из вас понадобится.

1 Ответ

11 голосов
/ 08 марта 2012

В Free Pascal тип интерфейса зависит от режима. В основном это режим COM или CORBA . COM по умолчанию и примерно совместим с Delphi. CORBA - более простой случай без подсчета ссылок. (и, следовательно, также не генерирует вызовы для пересчета функций). Таким образом, интерфейс FPC Corba похож на гипотетического предка интерфейса IUnknown.

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

Однако это иногда выявляет скрытые (плохие) предположения в коде, особенно при использовании ссылок на интерфейсы и ссылок на объекты в рамках одной процедуры, которая может «выжить» в Delphi, но не в FPC. Это типичный случай, который показывает, что длительно работающий код не обязательно корректен. При изменении реализации можно заметить только скрытые предположения

(добавлено позже :) обратите внимание, что вы можете использовать стиль COM в * nix. В основном это вставка вызовов в подпрограммы подсчета ссылок, которые разделяют два типа интерфейса. Не на какую систему (COM, Corba или просто в подсчете ссылок RTL) эти вызовы направляются.

Обратите внимание, что я думаю, что имена COM и Corba для обоих типов интерфейсов были выбраны неправильно. Интерфейсы Corba фактически пересчитаны, но традиционно этот пересчет обрабатывается вручную, поскольку Java не поддерживает интерфейсы с внешней обработкой в ​​автоматическом режиме.

...