2013-09-03 4 views
1

나는 그 뒤에 인터페이스와 해당 객체를 가지고있다. 예를 들어 ...가상 추상 메서드를 사용하여 인터페이스 개체를 상속 할 수 있습니까?

IMyInterface = interface 
    function GetSomething: WideString; 
    procedure SetSomething(const Value: WideString); 
    property Something: WideString read GetSomething write SetSomething 
    end; 

    TMyObject = class(TInterfacedObject, IMyInterface) 
    private 
    function GetSomething: WideString; 
    procedure SetSomething(const Value: WideString); 
    public 
    property Something: WideString read GetSomething write SetSomething 
    end; 

이 인터페이스를 사용하여 DLL에서이 개체와 상호 작용할 수 있습니다.

지금 나는 기본적으로 다음을 상속 아이를 강제로 기본 필드는 가상 및 추상적하고 싶습니다 제외

TMyOtherObject = class(TMyObject) 
    private 
    function GetSomething: WideString; override; 
    procedure SetSomething(const Value: WideString); override; 

...이 객체를 상속 이러한 메소드의 일부를 오버라이드 (override)하고 싶습니다. ..

TMyObject = class(TInterfacedObject, IMyInterface) 
    private 
    function GetSomething: WideString; virtual; abstract; 
    procedure SetSomething(const Value: WideString); virtual; abstract; 

이 작업을 수행 할 수 있고 인터페이스가 여전히이 필드에서 작동합니까? 인터페이스 내에서 이렇게 정의해야합니까? (나는 물론 인터페이스의 모든 필드는 이미 추상적이라는 것을 알고있다)

+3

왜 자신이 컴파일러에 시도하지 :

여기에 지점을 증명하는 간단한 프로그램입니다? (배우면서) - 왜 이것이 효과가 없다고 기대합니까? –

답변

4

실제로 이것을 할 수있다. 추상 또는 기타 가상 메소드가 인터페이스 계약을 충족시키는 데 사용될 수 있습니다.

인터페이스 메서드를 virtual 또는 abstract으로 선언 할 수 없습니다. 어쨌든 virtualabstract은 인터페이스가 아닌 구현의 속성이므로 의미가 거의 없습니다.

마지막으로 구현 개체에서 속성을 다시 선언 할 필요가 없습니다. 인터페이스를 통해 이러한 객체를 참조한다고 기대하기 때문에 속성 선언을 반복하는 것이 중요하지 않습니다.

{$APPTYPE CONSOLE} 

type 
    IMyInterface = interface 
    procedure Foo; 
    end; 

    TMyObject = class(TInterfacedObject, IMyInterface) 
    private 
    procedure Foo; virtual; abstract; 
    end; 

    TMyOtherObject = class(TMyObject) 
    private 
    procedure Foo; override; 
    end; 

procedure TMyOtherObject.Foo; 
begin 
    Writeln(ClassName); 
end; 

var 
    Intf: IMyInterface; 

begin 
    Intf := TMyOtherObject.Create; 
    Intf.Foo; 
    Readln; 
end. 
+0

그래서 그냥 인터페이스에서 정상적으로 선언하고 기본 인터페이스 객체에 구현하지 않고 파생 객체까지 두어 구현하지 마십시오. –

+0

인터페이스의 속성 만 선언하면됩니다. 그게 다야. 인터페이스를 통해서만 객체에 액세스 할 수 있기 때문입니다. –

+0

의미가 있습니다.이 기본 객체의 모든 상속은 어쨌든 그것을 오버라이드해야합니다. 그러나 인터페이스 객체에서 가상 추상적 인 메서드를 사용할 수 있다는 것을 아는 것은 여전히 ​​좋은 일입니다. –

관련 문제