2015-01-30 1 views
7

Nick Hodges의 "Coding in Delphi"책을 읽고 있는데 인터페이스 사용법을 이해하려고합니다.Delphi 인터페이스를 이해하려고 시도하십시오.

unit INameImplementation; 

interface 

uses 
    INameInterface; 

type 
    TPerson = class(TInterfacedObject, IName) 
    protected 
     function FirstName: string; 
     function LastName: string; 
    end; 

implementation 

{ TPerson } 

function TPerson.FirstName: string; 
begin 
    Result := 'Fred'; 
end; 

function TPerson.LastName: string; 
begin 
    Result := 'Flinstone'; 
end; 

end. 

나는 '이 시점에서 : 책의 샘플에 따라,

unit INameInterface; 

interface 

type 
    IName = interface 
    ['{CE5E1B61-6F44-472B-AE9E-54FF1CAE0D70}'] 
    function FirstName: string; 
    function LastName: string; 
    end; 

implementation 

end. 

다른 장치에서 나는이 인터페이스의 구현을 넣어했습니다 는 단위에서 나는 asimple 인터페이스를 넣었습니다 내가 만든 객체를 사용하기 위해 간단한 VCL 양식 응용 프로그램을 만들었습니다. 양식 코드는 다음과 같습니다.

unit main; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, 
    Vcl.StdCtrls, INameImplementation; 

type 
    TfrmMain = class(TForm) 
    lblFirtName: TLabel; 
    lblLastName: TLabel; 
    txtFirstName: TStaticText; 
    txtLastName: TStaticText; 
    btnGetName: TButton; 
    procedure btnGetNameClick(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    Person: TPerson; 
    public 
    { Public declarations } 
    end; 

var 
    frmMain: TfrmMain; 

implementation 

{$R *.dfm} 

procedure TfrmMain.FormCreate(Sender: TObject); 
begin 
    txtFirstName.Caption := ''; 
    txtLastName.Caption := ''; 
end; 

procedure TfrmMain.btnGetNameClick(Sender: TObject); 
begin 
    txtFirstName.Caption := ... 
end; 

end. 

내 질문은 다음과 같습니다. 어떻게 인터페이스를 사용할 수 있습니까? 두 가지 기능은 protected로 선언되므로 양식에서 어떻게 액세스 할 수 있습니까? 내가 공개로 정의했거나 INameInterface 인터페이스 유닛을 사용해야합니까? 인터페이스에 대해 몹시 혼란 스럽습니다! 당신이 아는 당신은 이미 이해를 보여준 것 이상으로

에로스

+1

인터페이스 사용 방법 중 하나의 좋은 예 ... 호출 프로세스 내에서 사용하려는 객체가 포함 된 DLL이 있다고 가정 해보십시오. DLL 경계를 넘어 객체를 전달할 수는 없지만, String의 멤버가 아닌 String을 WideString과 같이 사용하면 인터페이스도 전달할 수 있습니다. 그런 다음 DLL 내부의 객체를 인스턴스화하고 해당 객체의 인터페이스 참조를 DLL에서 다시 호출 응용 프로그램으로 전달합니다. 호출하는 응용 프로그램은 객체를 직접 호출하는 것과 같은 방법으로 해당 인터페이스와 상호 작용할 수 있습니다. –

+0

@Jerry 그건 바이너리 interop 구현 문제가 더있어. 나는 인터페이스가 더 깊은 개념이라고 생각한다. –

답변

8

은 기본적으로 세 가지가 있습니다.

var 
    Name: IName; 
.... 
Writeln(Name.FirstName); 
Writeln(Name.LastName); 

:

1. 인터페이스에 대한 참조가있는 경우 인터페이스

의 메소드를 호출하는 방법, 당신은 당신이 클래스 참조에서와 같이 메서드를 호출 할 수 있습니다 2. 인터페이스 참조를 얻는 방법

일반적으로 사용하려는 인터페이스를 구현하는 클래스를 인스턴스화하여이 작업을 수행합니다.

var 
    Name: IName; 
.... 
Name := TPerson.Create; 
// now you can use Name as before 

인터페이스 참조를 가져 오는 다른 방법이 있지만 지금은 한쪽으로 두겠습니다.

3.

주위 통과 당신은 새로운 객체 당신이 인터페이스를 사용할 필요가 모든 시간을 만들려하지 않을 수 있습니다

인터페이스 방법. 따라서 다른 당사자에게 사용할 인터페이스를 전달할 수 있습니다. 예를 인터페이스는 메서드 매개 변수로 전달 될 수있는 경우 : 함수 호출 및 특성을 통해 인터페이스 참조를 얻을 수 있습니다

procedure Foo(Name: IName); 
begin 
    // use Name as before 
end; 


두 가지 기능을 어떻게 내가 할 수있는 protected로 선언 양식에서 액세스 할 수 있습니까?

글쎄, 그들은 구현 개체에서 protected로 선언되었습니다. 그러나 구현 객체를 통해 액세스하지 않을 것입니다. 인터페이스를 통해 액세스 할 수 있습니다. 즉, 구현 객체의 가시성은 인터페이스의 관점과 관련이 없다는 것을 의미합니다.

양식 단위는 인터페이스를 구현하는 개체를 만드는 데 필요한 INameImplementation을 참조합니다. 또한 코드가 인터페이스 자체를 볼 수 있도록 INameInterface을 사용해야합니다.

이 예제는 아직 구현 객체 유형을 볼 수 있기 때문에 아직 강력하지 않습니다. 그러나 그것이 당신에게서 숨겨져 있고 당신이 볼 수있는 모든 것이 IName을 반환 한 함수라고 상상해보십시오. 인터페이스가 잠재력을 달성 할 수있는 시점에 이르렀습니다.

+0

대다수의 David보다. 또 다른 질문입니다. 그래서 주 장치의 uses 절에 INameInterface 및 INameImplementation을 포함해야합니다. 이 종류의 객체가 정상적으로 사용됩니까? – Eros

+0

인터페이스에 관해서는이 말보다 더 많은 이야기가 있지만 기본에 충실하려고 노력했습니다. 나는 닉의 책에 더 많은 것을 말하고있다. –

+0

@Eros : 모든 인터페이스 사용자는 인터페이스 장치 만 참조해야합니다. 의존성 삽입은이 코딩 스타일에 자연스럽게 부합합니다. – whosrdaddy

관련 문제