(delphi11最新学习资料) Object Pascal 学习笔记---第11章第2节 (从接口引用中提取对象)

11.2.5 从接口引用中提取对象

​ 在过去多个Object Pascal 语言版本中,当你将一个对象赋值给一个接口变量时,是无法访问原始对象的。有时,开发人员会在接口中添加一个 GetObject 方法来执行该操作,但这种设计非常奇怪。

​ 在今天的Object Pascal语言中,你可以将接口引用转回先前被用来赋值的原始对象。你可以使用三种不同的操作:

  • 你可以编写一个 is 测试语句来验证是否能从接口引用中提取出一个给定类型的对象:

    IntfVar is TMyObject
    
  • 您可以编写一个 as 转换来执行类型转换,如果出现错误,则会引发异常错误时引发异常:

    IntfVar as TMyObject。
    
  • 你可以编写一个强制类型转,如果出现错误,则返回一个 nil指针:

    TMyObject(IntfVar)
    

    注解 在任何情况下,只有在接口最初是从 Object Pascal 对象而不是 COM server获取的情况下,类型转换操作才有效。还要注意的是,不仅可以向原始对象的类进行类型转换,还可以向其任一基类进行类型转换(遵循类型兼容性规则)。

​ 举例来说,可以看看一下这个简单的接口及其实现类(ObjFromIntf 示例的一部分):

type
  ITestIntf = interface(IInterface)
    ['{2A77A244-DC85-46BE-B98E-A9392EF2A7A7}']
    procedure DoSomething;
  end;

TTestImpl = class(TInterfacedObject, ITestIntf)
public
  procedure DoSomething;
  procedure DoSomethingElse; // 不在接口中
  destructor Destroy; override;
end;

​ 有了这些定义,你现在就可以定义一个接口变量,为其分配一个对象、进行一个cast转换,用它来调用接口中没有的一个方法:

var
  Intf: ITestIntf;
begin
  Intf := TTestImpl.Create;
  Intf.DoSomething;
  (Intf as TTestImpl).DoSomethingElse;

​ 您也可以用下面的方式编写代码,使用 is 测试语句和直接类型转换,而且您总是可以转换到对象实际类的基类:

var
  Intf: ITestIntf;
  Original: TObject;
begin
  Intf := TTestImpl.Create;
  Intf.DoSomething;
  if Intf is TObject then
    Original := TObject(Intf);
  (Original as TTestImpl).DoSomethingElse;

​ 考虑到直接转换如果失败会返回 nil,您也可以编写如下代码(不使用 is 测试):

Original := TObject(Intf);
if Assigned(Original) then
  (Original as TTestImpl).DoSomethingElse;

​ 请注意,将从接口中提取的对象赋值给变量会导致引用计数问题:当接口被设置为 nil 或退出作用域时,对象实际上已被删除,引用它的变量也将失效。您可以在示例的 BtnRefCountIssueClick 事件处理器中找到突出显示该问题的代码。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Object Pascal是一种强类型语言,对数据类型的定义、声明以及数据赋值和传递操作等有严格的语法规则。它的数据类型可以分为标准数据类型和高级数据类型,还支持自定义类型。 Delphi是一种基于Object Pascal的编程语言,用于桌面、移动、Web和控制台软件开发。它在1995年首次亮相之前的最初开发过程,被称为一个未命名的产品的代号。 通过将数据库工具和连接性作为新的Pascal产品的核心部分,Delphi成为了一个强大的数据库产品,并成功挤压了Borland的Pascal工具在市场上与Visual Basic-C竞争的地位。这使得Delphi成为传统Windows开发工具的领导者,并击败了微软在市场上的主导地位。123 #### 引用[.reference_title] - *1* [【2.Delphi语法基础】2.Object Pascal数据类型](https://blog.csdn.net/chenhaiy/article/details/122929788)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* *3* [2021年关于Delphi/Object Pascal编程语言的现状和历史](https://blog.csdn.net/xyzhan/article/details/119244320)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值