2009-04-03 4 views
2

私はコードをよりカプセル化するために、別々のユニットのハングアップを取得しようとしています。 私のメソッドのパブリック/プライベート宣言をソートしようとしているので、testunitを使用する他のユニットからそれらを呼び出すことができます。この例ではhellofromotherunitを公開しますが、sticklettersを非公開にしたいとします。Delphiで単位ファイルを使用する方法

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 

答えて

6

ユニット構造は、オブジェクトのパブリック/プライベートセクションのように見えますが、その前身であると言えるでしょう。しかし構文は異なります。

あなただけのように、インターフェース部方法ヘッダーを宣言しなければならない:

interface 
    procedure hellofromotherunit(); 

implementation 
    procedure hellofromotherunit(); begin .. end; 

許容各セクションのつのみ。

5

プライベート&公開クラスのみに適用されます。

hellofromotherunitの宣言をインターフェイスセクションにコピーします。しかし、そこにstickletterの宣言のコピーを置かないでください。

インターフェイスセクションに表示されるものはすべて、事実上公開されています。実装でのみ下にあるものはすべてプライベートです。

1

さらに、

各ユニットには2つの異なる部分があります。インタフェースと実装。

インターフェイスセクションには、すべてのパブリック定義(型、プロシージャ見出し、定数)が含まれています。実装セクションにはすべての実装の詳細が含まれています。

ユニットを使用する場合(uses句を使用)、そのユニットのパブリック定義にアクセスできます。このアクセスは再帰的なものではないため、ユニットAインタフェースがユニットBを使用し、ユニットCがユニットAを使用する場合、明示的に使用しない限り、ユニットBにアクセスすることはできません。

実装セクションでは、インターフェイスと、両方のuses節(インターフェイスと実装)で使用されるユニットにアクセスできます。

使用済みユニットのインタフェースは、残りのコンパイルを続ける前に最初にコンパイルされます。 [OK]を、

  • トライインタフェースA、必要不合格B
  • トライインタフェースBを:コンパイル

    unit A; 
    interface 
    uses B; 
    
    unit B; 
    interface 
    implementation 
    uses A; 
    

    :これは、実装内から循環依存関係を持つことができるという利点を持っています!

  • try interface A、ok!
  • 実装Aを試してみてください。
  • 実装Bを試してみてください。

各ユニットには、初期化セクションがあります(また、初期化セクションがある場合は、ファイナライゼーションセクションもあります)。初期化セクションは、ユニットの変数を初期化するために使用します。終了セクションはクリーンアップに使用されます。 これらを使用する場合、他のユニットの初期化を考慮しないことをお勧めします。単純で短くしてください。

ユニットも名前空間です。 Considder次の識別子が複数使用される単位で定義されている

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? 

はあなたが競合しています。しかし、これは名前空間の名前を優先させることで解決されます。したがって、最初の行は失敗します。

0

単にインターフェイスセクションにメソッドを宣言しないと、プライベートに保たれます。

unit Unit2; 

interface 
    function MyPublicFunction():Boolean; 

implementation 

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

function MyPublicFunction():Boolean; 
begin 
    // blah blah 
end; 
end. 
関連する問題