Вопрос

Я просто пытаюсь освоить отдельные модули, чтобы сделать мой код более инкапсулированным.Я пытаюсь разобраться с публичными/частными объявлениями моих методов, чтобы я мог вызывать их из других модулей, которые используют testunit.В этом примере я хочу сделать hellofromotherunit общественность, но stickletters частный.

unit testunit;    

interface

uses
  Windows, Messages, Dialogs;    

implementation

function stickletters(a,b:string):string;
begin
  result:=a+b;
end;

procedure hellofromotherunit();
begin
 showmessage(stickletters('h','i'));
end;

end.

Кажется, мне не удалось скопировать частную/публичную структуру из других модулей, как в:

Type
private
function stickletters(a,b:inter):integer;
public
procedure hellofromotherunit();
end
Это было полезно?

Решение

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

Вам нужно только объявить заголовок метода в разделе интерфейса, например:

interface
  procedure hellofromotherunit();

implementation
  procedure hellofromotherunit(); begin .. end;

Допускается только один из каждого раздела.

Другие советы

Частный и публичный применяются только к классам.

Что вам нужно сделать, так это поместить копию объявления hellofromotherunit в раздел интерфейса.Однако не размещайте там копию декларации стикера.

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

Кроме того,

Каждый блок состоит из двух отдельных частей.Интерфейс и реализация.

Раздел интерфейса содержит все общедоступные определения (типы, заголовки процедур, константы).Раздел реализации содержит все подробности реализации.

Когда вы используете единицу (используя раздел Uses), вы получаете доступ к общедоступным определениям этой единицы.Этот доступ не является рекурсивным, поэтому, если интерфейс модуля A использует модуль B, а модуль C использует модуль A, вы не получите доступа к модулю B, если не используете его явно.

Раздел реализации имеет доступ к интерфейсу, к модулю, используемому в обоих разделах использования (интерфейс и реализация).

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

unit A;
interface
uses B;

unit B;
interface
implementation
uses A;

Что компилируется:

  • попробуйте интерфейс A, неудачно, нужен B
  • попробуйте интерфейс B, ок!
  • попробуйте интерфейс А, ок!
  • попробуйте реализацию А, ок!
  • попробуйте реализацию B, ок!

У каждого модуля также есть раздел инициализации (и если у него есть раздел инициализации, он также может иметь раздел финализации). Раздел инициализации используется для инициализации переменных модуля.Разделы финализации используются для очистки.Когда вы их используете, разумно не рассчитывать на инициализацию других модулей.Просто делайте их простыми и короткими.

Модуль также является пространством имен.Учтите следующее:

unit A;
interface
const foo = 1;

unit B;
interface
const foo = 2;

unit C;
interface
uses A, B;

const
  f1 = foo;
  f2 = A.foo;
  f3 = B.foo;

Если идентификатор определен в нескольких используемых единицах, берется последняя возможная единица в списке использований.Итак, f1 = 2.Но вы можете добавить к нему префикс имени модуля (пространства имен), чтобы решить эту проблему.

С появлением .net разрешены пространства имен, состоящие из нескольких частей, что создает другие приятные проблемы:

unit foo;
interface
type
  rec1 = record
    baz : Boolean;
  end;
var
  bar : rec1;

unit foo.bar;
interface
var
  baz : Integer;

uses
  foo, foo.bar;    
begin
  foo.bar.baz := true;
  foo.bar.baz := 1;
end.  

// 1. Which these lines gives an error and why?
// 2. Does the result change if you write uses foo.bar, foo?

В данном случае у вас конфликт.Но это решается путем присвоения именам пространств имен более высокого приоритета.Итак, первая строка терпит неудачу.

Просто не объявляйте метод в разделе интерфейса, и он останется закрытым.

unit Unit2;

interface
  function MyPublicFunction():Boolean;

implementation

function MyPrivateFunction():Boolean;
begin
  // blah blah
end;

function MyPublicFunction():Boolean;
begin
  // blah blah
end;
end.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top