TypeCasting:下面两行代码有什么区别?

Del*_*ner 3 delphi delphi-7

下面两行代码有什么区别.两者都试图获得路径,一个正在运行,另一个正在抛出错误.我正在研究Delphi-7

Path:= (((FFormOwner as TForm).Designer) as IDesigner).GetPrivateDirectory; --Working
Path:= IDesigner(TForm(FFormOwner).Designer).GetPrivateDirectory ;  --Error
Run Code Online (Sandbox Code Playgroud)

下面是使用代码行来获取路径的代码.

constructor TsampleComponent.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FFormOwner:=TForm(Owner);
  if not (Owner is TForm) then
    repeat
      FFormOwner:=TForm(FFormOwner.Owner);
    until (FFormOwner is TForm) or (FFormOwner.Owner=nil);

  if (csDesigning in ComponentState) then
    Path:= (((FFormOwner as TForm).Designer) as IDesigner).GetPrivateDirectory
  else
    Path:=ExtractFilePath(Application.EXEName);
.
.

end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 8

IDesigner(TForm(FFormOwner).Designer)
Run Code Online (Sandbox Code Playgroud)

这执行简单的重新解释演员Designer.它会失败,因为Designer它的类型IDesignerHook不同IDesigner.

(FFormOwner as TForm).Designer) as IDesigner
Run Code Online (Sandbox Code Playgroud)

这将执行运行时查询,IDesigner并通过调用解析QueryInterface.这是从现有接口获取不同接口的正确方法.