Delphi 与 as 和 Supports 的区别
Delphi casting with as and Supports difference
使用 Supports
和 as
关键字进行转换有什么区别,除了使用 as
我首先需要检查是否可以使用 is
关键字进行转换。
Supports
将提供一个接口,如果该接口被支持的话。
is
确定 class/interface 是否派生自另一个 class/interface.
as
与 is
做同样的事情,而且 returns 类型检查转换。
如果你已经用is
确认过一次强制转换成功,你就不需要使用as
,直接直接强制转换,效率更高:
if(pSomeObjectRef is TMyObject) then
TMyObject(pSomeObjectRef).MyUsefulMethod(...);
由于Delphi不支持多重继承,使用接口是实现这种行为的唯一方法。一个对象可以是不止一个事物,而不仅仅是它本身或它的祖先。
如果您不使用接口,则不需要使用 Supports()
。
使用 as
转换允许您将对象引用转换为接口,以及对不同 class 对象的引用。就个人而言,我不使用 as
,而且我在查看的代码中很少看到它。由于 as
可以引发异常,因此您应该采取措施避免异常,并在引发异常时捕获它们。因为您无论如何都可以检查这些,所以永远不需要使用 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..finally
或 try..except
块),但当然还有其他意见!
使用 Supports
和 as
关键字进行转换有什么区别,除了使用 as
我首先需要检查是否可以使用 is
关键字进行转换。
Supports
将提供一个接口,如果该接口被支持的话。
is
确定 class/interface 是否派生自另一个 class/interface.
as
与 is
做同样的事情,而且 returns 类型检查转换。
如果你已经用is
确认过一次强制转换成功,你就不需要使用as
,直接直接强制转换,效率更高:
if(pSomeObjectRef is TMyObject) then
TMyObject(pSomeObjectRef).MyUsefulMethod(...);
由于Delphi不支持多重继承,使用接口是实现这种行为的唯一方法。一个对象可以是不止一个事物,而不仅仅是它本身或它的祖先。
如果您不使用接口,则不需要使用 Supports()
。
使用 as
转换允许您将对象引用转换为接口,以及对不同 class 对象的引用。就个人而言,我不使用 as
,而且我在查看的代码中很少看到它。由于 as
可以引发异常,因此您应该采取措施避免异常,并在引发异常时捕获它们。因为您无论如何都可以检查这些,所以永远不需要使用 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..finally
或 try..except
块),但当然还有其他意见!