【发布时间】:2012-03-02 03:34:59
【问题描述】:
在 Delphi 2007 中,我使用一个类来实现第二类支持的接口之一。这是有效的。 Delphi 帮助指出:
默认情况下,使用 implements 关键字代表所有接口 方法。但是,您可以使用方法解析子句或声明 类中实现某些接口方法的方法 覆盖此默认行为。
但是,当我在我的第二个类中声明一个具有与其中一个接口方法匹配的签名的方法时,它不会被调用。
我想知道这是不是因为我在创建该类时通过另一个接口访问它。
下面是一个演示我的问题的测试程序:
program Project1;
{$APPTYPE CONSOLE}
type
IInterface1 = interface
['{15400E71-A39B-4503-BE58-B6D19409CF90}']
procedure AProc;
end;
IInterface2 = interface
['{1E41CDBF-3C80-4E3E-8F27-CB18718E8FA3}']
end;
TDelegate = class(TObject)
protected
procedure AProc;
end;
TMyClass = class(TInterfacedObject, IInterface1, IInterface2)
strict private
FDelegate: TDelegate;
property Delegate: TDelegate read FDelegate implements IInterface1;
public
constructor Create;
destructor Destroy; override;
procedure AProc;
end;
procedure TDelegate.AProc;
begin
writeln('TClassDelegate.AProc');
end;
constructor TMyClass.Create;
begin
inherited;
FDelegate := TDelegate.Create;
end;
destructor TMyClass.Destroy;
begin
FDelegate.Free;
inherited;
end;
procedure TMyClass.AProc;
begin
writeln('TMyClass.AProc');
end;
var
MyObj : IInterface2;
begin
MyObj := TMyClass.Create;
(MyObj as IInterface1).AProc;
end.
当我运行它时,我得到了输出:
TClassDelegate.AProc
我想要的是:
TMyClass.AProc
任何帮助表示赞赏。
【问题讨论】:
-
注释掉“FDelegate := TDelegate.Create;”并运行它,你会玩得很开心(:
-
@DorinDuminica,感谢您的建议。这并没有改变行为。同样在我的真实代码中,TDelegate中还有其他的属性和方法,所以我想我需要构造一个实例来避免访问冲突。干杯。
-
我知道,我觉得奇怪的是代码在没有创建实例的情况下工作,这是我唯一的观点,抱歉没用):
-
您正在调用
IInterface1.AProc(myObj as IInterface1=TDelegate实例)所以(myObj as IInterface1).AProc等于FDelegate.AProc。所以这种行为是预期的并且是正确的。如果你想调用TMyClass.AProc,你应该使用TMyClass引用来调用它。如果你没有类引用,你想要TMyClass的调用过程? -
好的 :) 我明白你的意思了 :) 请参阅下面的答案。
标签: delphi delphi-2007