【发布时间】:2014-09-18 20:23:12
【问题描述】:
下面的代码不起作用。
program Project7;
{$APPTYPE CONSOLE}
{$R *.res}
uses System.SysUtils;
type
I1 = interface
['{B4BF44AD-23A9-4F42-BA2B-6E137E22344E}']
procedure Test1;
end;
I2 = interface(I1)
['{AAAAAAAA-23A9-4F42-BA2B-BBBBBBBBBBBB}']
procedure Test2;
end;
T12 = class(TInterfacedObject, I2)
public
procedure Test1;
procedure Test2;
public
function MeAsI1: I1;
function MeASI2: I2;
end;
function T12.MeAsI1: I1;
begin
Result:= (self as I1);
end;
function T12.MeASI2: I2;
begin
Result:= (self as I2);
end;
procedure T12.Test1;
begin
Writeln('T12: test1 from interface i1');
end;
procedure T12.Test2;
begin
Writeln('T12: test2 from interface i2');
end;
实施:
var
MyClass: T12;
AI1: I1;
AI2: I2;
begin
MyClass:= T12.Create;
AI2:= MyClass.MeAsI2;
AI2.Test2;
Readln;
AI1:= MyClass.MeAsI1; //<< Exception interface not supported
AI1.Test1;
Readln;
end.
它给出了一个例外:interface not supported。
看起来 interface inheritance 不像 class inheritance 那样工作。
如果我将接口 I1 添加到类 T12 中,它确实可以工作,但是当一个类实现许多接口时,这会变得有点傻。
有没有办法只声明 I2 并且仍然能够从类内部返回对 I1 的引用?
我使用的是Delphi XE6,但我确定Delphi 3中的错误是一样的。
编辑
一个用例是:
IReadOnly = interface
function GetSomething: integer;
...
IRWIntf = interface(IReadOnly)
procedure SetSomething(value: integer);
....
【问题讨论】:
-
您的 I2 缺少 GUID
-
由于 AI2 被声明为 I2 并且 I2 错过了 MeAsI1 的声明,这甚至不应该编译。
-
没有。该类没有实现
I1。致电支持人员自行检查? -
复制粘贴,I2 没有 GUID,正打算换一个数字,但分心了。
-
好的。认为这样。在适当的时候你会接受你的类没有实现
I1。
标签: delphi inheritance interface