Delphi铸造与as和Supports的区别

使用Supportsvsas关键字进行转换有什么区别,除此之外,as我首先需要检查是否可以使用is关键字进行转换。

回答

Supports 如果支持该接口,将提供该接口。

is 确定一个类/接口是否派生自另一个类/接口。

as与 做同样的事情is,但也返回一个类型检查的强制转换。

如果您已经确认转换is会成功,则不需要使用as,您可以直接执行转换,这样效率更高:

if(pSomeObjectRef is TMyObject) then
  TMyObject(pSomeObjectRef).MyUsefulMethod(...);

由于 Delphi 不支持多重继承,因此使用接口是实现这种行为的唯一方法。一个可以是多个事物的对象,而不仅仅是它自己或它的祖先。

如果您不使用接口,则不需要使用Supports().

使用asto cast 允许您将对象引用强制转换为接口,以及对不同对象类的引用。就我个人而言,我不使用as,而且我很少在我正在查看的代码中看到它。由于ascan 引发异常,您应该采取措施避免异常,并在引发异常时捕获它们。由于您无论如何都可以检查这些,因此永远不需要使用as.

转换到接口时,您可以使用以下结果Supports()

if (SysUtils.Supports(pSomeObjectRef, IMyWantedInterface, diInterfaceRef)) then
begin
  diInterfaceRef._AddRef();   // removed when diInterface falls out of scope
  ...
end
else
begin  // it doesn't support the interface!
  ...
end;

无论您是想捕获异常(有些人喜欢,有些人不喜欢 - 它确实使代码不那么线性),还是为 编写代码if..else,通常是一个偏好问题。我宁愿不依赖异常(但我仍然有try..finallytry..except阻止),但当然还有其他意见可用!

  • Use as when your program can't work if the object doesn't support the interface. Otherwise use Supports.

以上是Delphi铸造与as和Supports的区别的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>