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

devtools/2024/9/24 21:21:15/
11.2.5 从接口引用中提取对象

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

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

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

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

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

    TMyObject(IntfVar)
    

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

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

typeITestIntf = interface(IInterface)['{2A77A244-DC85-46BE-B98E-A9392EF2A7A7}']procedure DoSomething;end;TTestImpl = class(TInterfacedObject, ITestIntf)
publicprocedure DoSomething;procedure DoSomethingElse; // 不在接口中destructor Destroy; override;
end;

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

varIntf: ITestIntf;
beginIntf := TTestImpl.Create;Intf.DoSomething;(Intf as TTestImpl).DoSomethingElse;

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

varIntf: ITestIntf;Original: TObject;
beginIntf := TTestImpl.Create;Intf.DoSomething;if Intf is TObject thenOriginal := TObject(Intf);(Original as TTestImpl).DoSomethingElse;

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

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

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


http://www.ppmy.cn/devtools/39900.html

相关文章

解决qt5.12.12编译源码没有libqxcb的问题

最近要研究一下qt源码,因为设计到要修改源码,所以需要编译源码并替换修改的库文件运行验证。 我这里使用的是qt5.12.12版本,去官网上下载对应版本的安装包,安装时勾选上源码即可。 后面编译完发现,plugins/platforms/目录下没有生成库文件libqxcb.so,造成了一点麻烦。 设置 e…

哈希表(unordered_set、unordered_map)

文章目录 一、unordered_set、unordered_map的介绍二、哈希表的建立方法2.1闭散列2.2开散列(哈希桶/拉链法) 三、闭散列代码(除留余数法)四、开散列代码(拉链法/哈希桶) 一、unordered_set、unordered_map的…

设计模式——访问者模式(Visitor)

访问者模式(Visitor Pattern)是一种将数据操作与数据结构分离的设计模式。这种模式适用于数据结构相对稳定,而操作算法经常改变的情况。访问者模式将数据结构(稳定的部分)中的元素(Element)的访…

蓝桥杯成绩已出

蓝桥杯的成绩早就已经出来了,虽然没有十分惊艳 ,但是对于最终的结果我是心满意足的,感谢各位的陪伴,关于蓝桥杯的刷题笔记我已经坚持更新了49篇,但是现在即将会告别一段落,人生即将进入下一个规划。我们一起…

HTTPS对于网站到底价值几何?

现在HTTPS基本上已经是网站的标配了,很少会遇到单纯使用HTTP的网站。但是十年前这还是另一番景象,当时只有几家大型互联网公司的网站会使用HTTPS,大部分使用的都还是简单的HTTP,这一切是怎么发生的呢? 为什么要把网站…

设计模式:观察者模式

观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式通常被用来实现事件处理系统、实时数据更新、…

QT day5 作业

服务器头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QList> //链表类 #include <QMessageBox> //消息对话框类 #include <QDebu…

【R语言与统计】SEM结构方程、生物群落、多元统计分析、回归及混合效应模型、贝叶斯、极值统计学、meta分析、copula、分位数回归、文献计量学

统计模型的七大类&#xff1a;一&#xff1a;多元回归 在研究变量之间的相互影响关系模型时候&#xff0c;用到这类方法&#xff0c;具体地说&#xff1a;其可以定量地描述某一现象和某些因素之间的函数关系&#xff0c;将各变量的已知值带入回归方程可以求出因变量的估计值&…