문제

나는 단지 내 코드를 더 캡슐화하기 위해 별도의 장치를 중단하려고 노력하고 있습니다. 내 방법의 공개/개인 선언을 정리하려고하므로 사용하는 다른 장치에서 전화 할 수 있습니다. 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
도움이 되었습니까?

해결책

단위 구조는 객체의 공개/개인 섹션과 비슷해 보이며, 그것이 그들의 선구자라고 말할 수 있습니다. 그러나 구문은 다릅니다.

인터페이스 섹션에서 메소드 헤더 만 선언하면됩니다.

interface
  procedure hellofromotherunit();

implementation
  procedure hellofromotherunit(); begin .. end;

각 섹션 중 하나만 허용됩니다.

다른 팁

개인 및 공개는 수업에만 적용됩니다.

당신이하고 싶은 것은 Hellofromotherunit의 선언 사본을 인터페이스 섹션에 넣는 것입니다. 그러나 Stickletter의 선언 사본을 거기에 넣지 마십시오.

인터페이스 섹션에 나타나는 것은 효과적으로 공개됩니다. 구현에서만 내려진 것은 비공개입니다.

게다가,

각 장치에는 두 개의 별개의 부품이 있습니다. 인터페이스 및 구현.

인터페이스 섹션에는 모든 공개 정의 (유형, 절차 제목, 상수)가 포함되어 있습니다. 구현 섹션에는 모든 구현 세부 정보가 포함되어 있습니다.

장치를 사용하면 (사용 조항 사용) 해당 단위의 공개 정의에 액세스 할 수 있습니다. 이 액세스는 재귀가 아니므로 단위 A가 단위 B를 사용하고 단위 C가 단위 A를 사용하는 경우 명시 적으로 사용하지 않는 한 B에 액세스 할 수 없습니다.

구현 섹션은 인터페이스에 액세스 할 수 있으며, 두 클로스 (인터페이스 및 구현) 모두에 사용되는 장치에 액세스 할 수 있습니다.

중고 장치의 인터페이스는 나머지를 계속 컴파일하기 전에 먼저 컴파일됩니다. 이는 구현 내에서 원형 의존성을 가질 수 있다는 이점이 있습니다.

unit A;
interface
uses B;

unit B;
interface
implementation
uses A;

어떤 컴파일 :

  • 인터페이스 a, 실패 필요 b를 시도하십시오. b
  • 인터페이스 B를 시도해보세요!
  • 인터페이스 A, OK!
  • 구현 A, OK!
  • 구현 B, OK!

각 장치에는 초기화 섹션이 있습니다 (초기화 섹션이있는 경우 최종화 섹션이있을 수도 있습니다.) 초기화 섹션은 장치의 변수를 초기화하는 데 사용됩니다. 최종화 섹션은 정리에 사용됩니다. 이것을 사용하면 다른 장치의 초기화에 의존하지 않는 것이 현명합니다. 단순하고 짧게 유지하십시오.

장치도 네임 스페이스입니다. 다음을 고려하십시오.

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