Frage

Ich versuche nur, den Dreh separater Einheiten zu bekommen, um meinen Code mehr gekapselte zu machen. Ich versuche, die öffentliche / private Erklärungen meiner Methoden zu erhalten aussortiert, so kann ich sie von anderen Einheiten aufrufen, die testunit verwenden. In diesem Beispiel möchte ich hellofromotherunit öffentlich machen, aber stickletters privat.

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.

Ich kann nicht die private / öffentliche Struktur von anderen Einheiten scheint zu kopieren, wie in:

Type
private
function stickletters(a,b:inter):integer;
public
procedure hellofromotherunit();
end
War es hilfreich?

Lösung

Der Aufbau der Einheit ein bisschen wie die öffentlichen / privaten Abschnitte von Objekten sieht, könnte man sagen, dass es ihr Vorläufer ist. Aber die Syntax ist anders.

Sie haben nur die Methode Header in dem Schnittstellenabschnitt zu erklären, wie in:

interface
  procedure hellofromotherunit();

implementation
  procedure hellofromotherunit(); begin .. end;

Nur einer von jedem Abschnitt erlaubt.

Andere Tipps

Privat & öffentlich gilt nur für Klassen.

Was Sie tun möchten, eine Kopie der Erklärung von hellofromotherunit in den Schnittstellenabschnitt gesetzt wird. dort keine Kopie der stickletter Erklärung setzt jedoch.

Alles, was in dem Schnittstellenabschnitt erscheint, ist effektiv Öffentlichkeit. Alles, was nur nach unten in der Umsetzung ist, ist privat.

Darüber hinaus

Jede Einheit verfügt über zwei verschiedene Teile. Die Schnittstelle und die Implementierung.

Die Schnittstelle Abschnitt enthält alle öffentlichen Definitionen (Typen, Verfahren Schriften, Konstanten). Die Umsetzung Abschnitt enthält alle Details der Implementierung.

Wenn Sie eine Einheit verwenden, (die uses-Klausel) Sie Zugang zu den öffentlichen Definitionen dieser Einheit erhalten. Dieser Zugang ist nicht rekursiv, so dass, wenn die Einheit A-Schnittstelleneinheit B verwendet, und Einheit C verwendet ein Gerät, Sie keinen Zugriff auf die Einheit B erhalten, wenn Sie es explizit verwenden.

Der implementation-Abschnitt hat Zugriff auf die Schnittstelle, an das Gerät in beiden verwendet uses-Klauseln (Schnittstelle und Implementierung).

Die Schnittstellen der verwendeten Einheiten werden zunächst kompiliert, bevor es weiter den Rest kompilieren. Dies hat den Vorteil, dass Sie zirkuläre Abhängigkeiten innerhalb der Implementierung haben können:

unit A;
interface
uses B;

unit B;
interface
implementation
uses A;

Welche kompiliert:

  • Schnittstelle A versuchen, fail brauchen B
  • versuchen Schnittstelle B, ok!
  • versuchen Schnittstelle A, ok!
  • versuchen Implementierung A, ok!
  • versuchen Implementierung B, ok!

Jede Einheit hat auch einen Initialisierungsabschnitt (und wenn es einen Initialisierungsabschnitt hat, könnte es auch eine Finalisierung Schnitt hat.) Der Initialisierungsabschnitt verwendet wird, um die Variablen des Geräts zu initialisieren. Die Finalisierung Abschnitte werden zur Reinigung verwendet. Wenn Sie diese verwenden, seine weise nicht auf Initialisierungen von anderen Einheiten zu zählen. halten sie nur einfach und kurz.

Einheit sind auch Namespaces. Considder wie folgt vor:

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;

Wenn eine Kennung in mehreren verwendeten Einheiten definiert ist, wird die letzte Einheit möglich in der uses-Liste aufgenommen. So f1 = 2. Aber man kann es mit der Einheit (Namespace) Namen Präfix dieses Problem zu lösen.

Mit der Einführung von .net, werden mehrteilige Namensräume erlaubt, die anderen nette Probleme stellt:

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 diesem Fall haben Sie einen Konflikt. Aber das wird erreicht, indem Namensraum-Namen höhere Priorität aufgelöst. So ist die erste Zeile nicht.

einfach nicht erklären, Verfahren in Schnittstellenbereich und es wird privat gehalten werden.

unit Unit2;

interface
  function MyPublicFunction():Boolean;

implementation

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

function MyPublicFunction():Boolean;
begin
  // blah blah
end;
end.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top