Pergunta

Eu só estou tentando pegar o jeito de unidades separadas para tornar meu código mais encapsulado. Eu estou tentando obter o público / privadas declarações de meus métodos classificados, para que eu possa chamá-los de outras unidades que usam testunit. Neste exemplo, eu quero tornar pública hellofromotherunit, mas stickletters privado.

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.

Eu não conseguia copiar a estrutura privada / pública de outras unidades como em:

Type
private
function stickletters(a,b:inter):integer;
public
procedure hellofromotherunit();
end
Foi útil?

Solução

A estrutura da Unidade parece um pouco com o público / seções privadas de objetos, você poderia dizer que é o seu precursor. Mas a sintaxe é diferente.

Você só tem que declarar o cabeçalho do método na seção interface, como em:

interface
  procedure hellofromotherunit();

implementation
  procedure hellofromotherunit(); begin .. end;

Apenas um de cada seção permitido.

Outras dicas

Privado e Público se aplicam somente a classes.

O que você quer fazer é colocar uma cópia da declaração de hellofromotherunit na seção interface. Não coloque uma cópia da declaração de stickletter lá em cima, no entanto.

Qualquer coisa que aparece na seção interface é efetivamente público. Qualquer coisa que é apenas para baixo na implementação é privado.

Além disso,

Cada unidade tem duas partes distintas. A interface ea implementação.

A seção interface contém todas as definições públicas (tipos, títulos procedimento, constantes). A seção de implementação contém todos os detalhes de implementação.

Quando você usa uma unidade, (usando a cláusula de usos) que você tenha acesso às definições públicas daquela unidade. Este acesso não é recursivo, então se a unidade usa a interface da unidade A B, e a unidade usa C unidade A, você não tem acesso a unidade B, a menos que você usá-lo explicitamente.

A seção de implementação tem acesso à interface, para a unidade usada em ambas as cláusulas usos (interface e implementação).

As interfaces de unidades utilizadas são compilados primeiro antes de continuar a compilar o resto. Isto tem a vantagem de que você pode ter dependências circulares de dentro da aplicação:

unit A;
interface
uses B;

unit B;
interface
implementation
uses A;

que compila:

  • tentar interface A, falhar necessidade B
  • interface de tentativa B, ok!
  • tentar interface A, ok!
  • implementação tentativa A, ok!
  • implementação tentativa B, ok!

Cada unidade tem também uma seção de inicialização (e se ele tem uma seção de inicialização, ele também poderia ter uma seção de finalização.) A seção de inicialização é usado para inicializar as variáveis ??da unidade. As secções de finalização são utilizados para limpeza. Quando você usá-los, seu sábio não contar com inicializações de outras unidades. Apenas mantê-los simples e curto.

Unidade também são namespaces. Considder o seguinte:

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;

Se um identificador é definido em vários unidades usadas, a última unidade possível na lista de usos é tomada. Então f1 = 2. Mas você pode prefixo com o nome da unidade (namespace) para resolver este problema.

Com a introdução do .net, múltiplos namespaces parte são permitidos que introduz outros problemas agradáveis:

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?

Neste caso, você tem um conflito. Mas isso é resolvido, dando nomes de namespace maior prioridade. Assim, a primeira linha de falha.

Simplesmente não declaram método na seção de interface e que serão mantidos em sigilo.

unit Unit2;

interface
  function MyPublicFunction():Boolean;

implementation

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

function MyPublicFunction():Boolean;
begin
  // blah blah
end;
end.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top