2012-05-02 2 views
2

Могу ли я представить базовый интерфейс для производного интерфейса.Могу ли я использовать тип Base для производного интерфейса?

Как мне сделать, как Delphi

Delphi генерируется код/​​Delphi 7:

function TXMLBook.Get_Id: IXMLId; 
begin 
    Result := ChildNodes['id'] as IXMLId; 
end; 

ChildNodes [ 'ID'] является базовым типом IXMLNode

IXMLId получают вид из IXMLNode

и мой код примера:

type 
IBase = interface(IInterface) 
['{5CEA3668-36CB-444C-8D3E-06644070A2B4}'] 
    function Test:AnsiString; 
end; 

TBase =class(TInterfacedObject,IBase) 
    function Test:AnsiString; 
end; 

IDerived =interface (IBase) 
['{8CDB2982-43B0-4636-B6F5-2561C0D419A9}'] 
    function Test2: AnsiString; 
end; 

TDerived=class (TBase,IDerived) 
    function Test:AnsiString; 
    function Test2:AnsiString; 
end; 

{ TBase } 

function TBase.Test: AnsiString; 
begin 
    Result:='Base Test'; 
end; 

{ TDerived } 

function TDerived.Test: AnsiString; 
begin 
    Result:='Derived Test'; 
end; 

function TDerived.Test2: AnsiString; 
begin 
    Result:='Derived Test2'; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    b:IBase; 
    d: IDerived; 
begin 
    b:=TBase.Create; 
    d:=b as IDerived; // Error : Interface not supported 

    ShowMessage(b.Test); 
end; 

ответ

3

Ваш TBase класс в настоящее время не реализует IDerived, он только реализует IBase. Ваш TDerived класс реализует как IBase(унаследовав от TBase) и IDerived(явно).

Вы должны либо

  1. Изменить TBase декларацию

    TBase =class(TInterfacedObject,IBase, IDerived)

    и реализовать IDerived методы в TBase.

  2. или изменить b:=TBase.Create; - b:=TDerived.Create;
+0

Thanks @Lieven. Delphi, как это сделать, вы знаете? Я не знаю, что классы будут выпущены позже. – zgn

+1

@zgn - Я не уверен, что понимаю ваш комментарий. Это вопрос или наблюдение? –

+0

На самом деле, я пытаюсь похож на код Delphi. Что вы можете сказать для самой верхней выборки delphi. – zgn

Смежные вопросы