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..finally或try..except阻止),但当然还有其他意见可用!
- Use as when your program can't work if the object doesn't support the interface. Otherwise use Supports.