Domanda

Sto solo cercando di ottenere il blocco di unità separate per fare il mio codice più incapsulato. Sto cercando di ottenere le pubbliche / private dichiarazioni dei miei metodi risolto, in modo che io possa chiamare da altre unità che utilizzano testunit. In questo esempio voglio fare hellofromotherunit pubblica, ma stickletters privato.

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.

Non riuscivo a copiare la struttura privata / pubblica da altre unità come in:

Type
private
function stickletters(a,b:inter):integer;
public
procedure hellofromotherunit();
end
È stato utile?

Soluzione

La struttura Unità sembra un po 'come sezioni pubblico / privato dagli oggetti, si potrebbe dire che è il loro precursore. Ma la sintassi è diversa.

È sufficiente per dichiarare l'intestazione metodo nella sezione di interfaccia, come in:

interface
  procedure hellofromotherunit();

implementation
  procedure hellofromotherunit(); begin .. end;

Solo uno di ogni sezione permesso.

Altri suggerimenti

Private & Public valgono solo per le classi.

Che cosa si vuole fare è mettere una copia della dichiarazione di hellofromotherunit nella sezione interfaccia. Non mettere una copia della dichiarazione di stickletter lassù, però.

Tutto ciò che appare nella sezione interfaccia è efficace pubblico. Tutto ciò che è solo verso il basso per l'attuazione è privato.

Inoltre,

Ogni unità ha due parti distinte. L'interfaccia e l'implementazione.

La sezione interfaccia contiene tutte le definizioni pubblici (tipi, intestazioni di procedura, costanti). La sezione implementazione contiene tutti i dettagli di implementazione.

Quando si utilizza un'unità, (utilizzando la clausola uses) si ottiene l'accesso alle definizioni pubbliche di tale unità. Questo accesso non è ricorsiva, quindi se l'unità Un'interfaccia utilizza un'unità B, e l'unità C utilizza unità A, non si ottiene l'accesso alle unità di B a meno che non lo si utilizza in modo esplicito.

La sezione implementazione ha accesso all'interfaccia, all'unità utilizzato sia utilizza clausole (interfaccia e implementazione).

Le interfacce delle unità utilizzate sono compilati prima di continua compilare il resto. Questo ha il vantaggio che si può avere dipendenze circolari dall'interno l'attuazione:

unit A;
interface
uses B;

unit B;
interface
implementation
uses A;

che compila:

  • Prova interfaccia A, fallire bisogno B
  • provare l'interfaccia B, ok!
  • provare l'interfaccia A, ok!
  • Prova implementazione A, ok!
  • Prova implementazione B, ok!

Ogni unità ha anche una sezione di inizializzazione (e se ha una sezione di inizializzazione, esso potrebbe avere anche una sezione finalizzazione.) La sezione di inizializzazione viene utilizzato per inizializzare le variabili dell'unità. Le sezioni finalizzazione vengono utilizzati per la pulizia. Quando si utilizzano questi, il suo bene a non contare su di inizializzazione di altre unità. Basta tenere loro semplice e breve.

Unità sono anche gli spazi dei nomi. Considder il seguente:

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 un identificatore è definito in più unità d'occasione, viene presa l'ultima unità possibile nella lista di usi. Così f1 = 2. Ma si può prefisso con il nome dell'unità (namespace) per risolvere questo problema.

Con l'introduzione di .net, multi namespace parte sono permessi che introduce altri problemi curato:

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?

In questo caso si ha un conflitto. Ma che si risolve dando i nomi dei namespace priorità più alta. Così la prima linea non riesce.

Semplicemente non dichiarare metodo nella sezione di interfaccia e sarà privato.

unit Unit2;

interface
  function MyPublicFunction():Boolean;

implementation

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

function MyPublicFunction():Boolean;
begin
  // blah blah
end;
end.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top