Delphi локальные функции - PullRequest
3 голосов
/ 13 апреля 2011

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

  1. Удалите объявление из интерфейса и переместите функцию перед ее зависимыми элементами в реализации - грязный, нелогичный порядок определений функций, который не всегда возможен, например, если есть. взаимозависимость
  2. Поместите все функции в статический класс (аля Java) и сделайте их публичными или приватными, в зависимости от ситуации - слишком много шаблонного, сложного
  3. Объявите вспомогательные функции локально для функций, в которых они используются - те же проблемы, что и в пункте 1

В идеале я хотел бы сделать это способом C / C ++, то есть объявить их как статические в разделе реализации. Это возможно? Есть ли лучший способ?

Ответы [ 2 ]

10 голосов
/ 13 апреля 2011

Вы все еще можете объявить свои функции так:

implementation

procedure ShowMe;forward;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMe;
end;

procedure showMe;
begin
  ShowMessage('Hello');
end;

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

Лично я предпочитаю объявлять этот метод классовым. (Давайте назовем это «пространство имен дружественное»). Но конечный результат почти такой же.

3 голосов
/ 13 апреля 2011

Я бы сделал:

Удалить объявление из интерфейс и переместить функцию перед его иждивенцы в реализации - грязный, нелогичный порядок определения функций, не всегда возможно, если есть, например, взаимное зависимость

Между прочим, нет способа объявить статический класс в Delphi, как в других языках. Только var и методы могут быть статическими, а не весь класс.

Есть еще 3 способа

1 - Вы можете создать класс и поместить весь код помощника в его личный раздел (возможно, методы static) и использовать его внутри модуля UtilitiesU. Но я бы не стал этого делать, я думаю, что 1 метод, который вы написали, является лучшим.

2 - Вы можете разделить весь свой вспомогательный код в другом модуле, чтобы он не назывался UtilitiesHelper.

3 - Вы можете смешивать 1 и 2, но используя защищенные методы. Тогда вы можете легко взломать вспомогательный класс в вашем модуле UtilitiesU. Пример:

В блоке UtilitiesHelper

TUtilitiesHelper = class
protected
   //all your methods here
end;

В блоке UtilitiesU

TUtilitiesHelperHack = class(TUtilitiesHelper)
end;

С этим вы можете получить доступ к защищенным методам. Но я тоже не рекомендую.

EDIT

Как сказал Кен, вы можете использовать:

implementation

procedure ShowMe;forward;

Я только что проверил это сам, и это сработало. (это также ново для меня, спасибо Кену).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...