delphi11专题

(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第3节(泛型约束)

14.3 泛型约束 ​ 正如我们所看到的,您在泛型类的方法中可以做的事情非常少。您可以传递它(即分配它)并执行上面我介绍的泛型类型函数允许的有限操作。 ​ 为了能够执行泛型类的实际操作,通常需要对其进行约束。例如,如果将泛型类型限制为类,则编译器将允许您在其上调用所有TObject方法。您还可以进一步限制类为给定层次结构的一部分,或实现特定接口,从而可以在泛型类型的实例上调用类或接口方法。

(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类型函数 )

14.2.4 泛型类型函数 ​ 到目前为止,我们遇到的泛型类型定义的最大问题是,您对泛型类型元素能做的事情非常少。有两种技术可以用来克服这个限制。第一种是利用运行时库的一些特殊函数,这些函数专门支持泛型类型;第二种(也是更强大的一种)是在定义泛型类时对可以使用的类型进行限制。 ​ 本节将重点介绍第一种方法,下一节将重点介绍约束。正如我提到的,有一些 RTL 函数可以处理泛型定义的参数类型 (T

(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类型实例化)

14.2.3 泛型类型实例化 ​ 请注意,这是一个相当高级的一节内容,重点关注泛型的一些内部细节及其潜在的优化。如果这是您第一次学习泛型,那么建议您多读一遍。 ​ 除了一些优化之外,每次实例化泛型类型时,无论是在方法中还是在类中,编译器都会生成一个新的类型。这种新类型不会与同一泛型的不同实例(或同一方法的不同版本)共用代码。。 ​ 以下是一个示例(它是GenericCodeGen示例的一部分

(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第3节(接口引用 vs 泛型接口约束)

14.3.4 接口引用 vs 泛型接口约束 ​ 在上一个例子中,我定义了一个泛型类,可以与实现特定接口的任何对象一起使用。我也可以通过创建基于接口引用的标准(非泛型)类来获得类似的效果。实际上,我可以定义一个类,如下所示(也是 IntfConstraint 示例的一部分): typeTPlainInftClass = classprivateFVal1, FVal2: IGetValue;pu

(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(标准类的泛型方法)

14.2.2 标准类的泛型方法 ​ 使用泛型类型定义类可能是最常见的情况,但泛型类型也可以用于非泛型类。换句话说,一个普通的类也可以有一个泛型方法。在这种情况下,不仅要在创建类的实例时为泛型占位符指定类型,还要在调用方法时指定类型。下面是一个使用泛型方法的类示例。以下是来自GenericMethod示例的具有泛型方法的示例类: typeTGenericFunction = classpubli

(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(Object Pascal中的泛型)

14.2 Object Pascal中的泛型 ​ 在前面的例子中,我们已经看到了如何在Object Pascal中定义和使用泛型类。我决定在深入讨论这个非常重要但又相当复杂的技术细节之前,通过一个例子来介绍泛型这一特性。在从语言角度讨论泛型之后,我们将列举更多的例子,包括使用和定义泛型容器类,这是该语言中这种技术的主要用途之一。 ​ 我们已经看到,当你定义一个类时,你可以在尖括号中添加一个额外

(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型

第三部分 高级语言特性 第14章 泛型 ​ Object Pascal 提供的强类型检查对于提高代码的正确性非常有用,这也是我在本书中经常强调的一个主题。不过,强类型检查也可能带来麻烦,因为你可能想编写一个存储过程或类,对不同的数据类型进行类似的处理。对象 Pascal 语言的一个特性可以解决这个问题,类似的语言(如 C# 和 Java)也有这个特性,即泛型。 ​ 泛型或模板类的概念实际上来

(delphi11最新学习资料) Object Pascal 学习笔记---第13章第3节 (仅销毁对象一次 )

13.3.2 仅销毁对象一次 ​ 另一个问题是,如果调用对象的析构函数两次,将会导致错误。析构函数是释放对象内存的方法。我们可以为析构函数编写代码,通常是覆盖默认的 Destroy 析构函数,以便让对象在被销毁之前执行一些代码。 ​ Destroy是TObject类的虚析构函数。大多数需要在对象销毁时执行自定义清理代码的类都会覆盖此虚方法。您绝对不应该定义新的析构函数,因为通常对象是通过调用F

(delphi11最新学习资料) Object Pascal 学习笔记---第12章操作类(类方法和类数据)

第12章 操作类 ​ 在过去的几章中,你已经了解了 Object Pascal 语言面向对象的基础:类、对象、方法、构造函数、继承、后期绑定、接口等等。现在,我们需要进一步了解与类管理相关的一些更高级、更具体的语言特性。从类引用到类助手(class helper),本章涵盖了许多其他 OOP 语言所没有的功能,或者至少在实现上有很大的不同。 ​ 本章的重点是类,以及在运行时对类的操作。在第 1

(delphi11最新学习资料) Object Pascal 学习笔记---第11章第3节(使用接口实现适配器模式)

11.3 使用接口实现适配器模式 ​ 作为在现实世界中使用接口的一个例子,我在本章中增加了一节关于适配器模式的内容。简而言之,适配器模式用于将一个类的接口转换为该类用户所期望的另一个接口。这样,你就可以在一个需要定义接口的框架中使用现有的类。 ​ 适配器模式可以通过映射的方式创建一个新的类层次结构来实现,或者通过扩展现有的类定义新的接口来实现。这可以通过多重继承(在支持多重继承的语言中)或使用

(delphi11最新学习资料) Object Pascal 学习笔记---第11章第2节 ( 接口的委托)

11.2.2 接口的委托 ​ 我用类似的方式定义了一个简单类实现IJumper接口: TJumperImpl = class(TAggregatedObject, IJumper)privateFPos: Integer;publicfunction Jump: string;function Walk: string;procedure SetPos(Value: Integer);fu

(delphi11最新学习资料) Object Pascal 学习笔记---第11章第1节 ( 接口的实现)

11.1.2 接口的实现 ​ 任何类都可以实现一个或多个接口,方法是在继承的基类后面列出这些接口,并为每个接口的每个方法提供一个实现: typeTAirplane = class(..., ICanFly)function Fly: string;end;function TAirplane.Fly: string;begin// 实际代码end; ​ 当一个类实现一个接口时,这个类必须

(delphi11最新学习资料) Object Pascal 学习笔记---第10章第3节(事件驱动编程)

10.3 事件驱动编程 ​ 在基于组件的程序库中(在许多其他情况下也是如此),您编写的代码不仅仅是一连串平顺的动作序列,而主要是反应的集合。这意味着你应该定义应用程序在发生某些事情时做出“反应”。这里“某些事情”可以是用户操作,例如单击按钮,系统操作,传感器状态的变化,通过远程连接获得的一些数据,或者几乎任何其他事情。 ​ 这些外部或内部触发的行动通常称为事件。事件最初是对基于消息的操作系统的

(delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节(通过引用设置属性)

10.1.7 通过引用设置属性 本节讲述一个较少使用的语言功能,这节内容相当高级。如果你还没有使用Object Pascal 的经验,那么你可以跳过。但是,即使你已经熟练掌握了 Object Pascal,那么你也很可能从未听说过这项功能。当 Object Pascal 编译器被扩展为直接支持 Windows COM 编程时,它获得了处理 "Put by Ref "属性(COM 术语)的能力,或

(delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节(属性实现了封装)

10.1.2 属性实现了封装 ​ 属性是一种非常合理的面向对象编程机制,是对封装思想认真考虑后的应用。本质上,你有一个名称,它隐藏了访问类信息的方式(无论是直接访问数据还是调用方法)。 ​ 事实上,通过使用属性,你最终得到一个不太可能发生变化的接口。同时,如果你只想允许用户访问类的某些字段,你可以轻松地将这些字段以属性形式发布,而不是将它们设置为public。你不需要编写额外的代码并且仍然能够

(delphi11最新学习资料) Object Pascal 学习笔记---第9章第6节(拦截异常)

9.6.2 拦截异常 ​ 随着时间的推移,Object Pascal 语言的原始异常处理系统又增加了一个高级功能,那就是方法: procedure RaisingException(P: PExceptionRecord); virtual; ​ 根据源代码文档: 该虚函数将在异常即将发生前被调用。在外部异常的情况下,由于 "引发 "条件已经开始,因此在创建对象后不久就会调用该函数。

(delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(继承和类型兼容性)

8.4.2 延迟绑定和多态性 ​ Object Pascal 函数和过程通常基于静态绑定,也称为早期绑定。这意味着方法调用是在编译或链接时解决的。面向对象编程语言允许延迟绑定或动态绑定,即根据用于调用的实例类型在运行时确定要调用的方法。 ​ 这种技术的优势被称为多态性。多态性允许你编写方法调用,并将其应用到变量上。但是,Delphi 会根据变量指向的对象类型来确定实际要调用的方法。由于前面讨论

(delphi11最新学习资料) Object Pascal 学习笔记---第9章第6节(嵌套异常和 InnerException机制)

9.6 异常的高级功能 ​ 除非你对这门语言已经有了很好的了解,否则第一次阅读这部分内容时最好跳过。在此之前,你可以先阅读下一章,将来再回到这一部分。 ​ 在本章的最后一部分,我将介绍一些与异常处理相关的高级主题。我将介绍嵌套异常(RaiseOuterException)和拦截类的异常(RaisingException)。 ​ 这些功能在早期版本的 Object Pascal 语言中并不存在

(delphi11最新学习资料) Object Pascal 学习笔记---第9章第5节(异常与构造函数)

9.5 异常与构造函数 ​ 围绕异常还有一个稍微高级一点的问题,即当异常在对象的构造函数中产生时会发生什么情况。并非所有 Object Pascal 程序员都知道,在这种情况下,将调用对象的析构函数(如果有的话)。 ​ 这一点很重要,因为它意味着一个部分初始化的对象可能会被调用析构函数。如果想当然地认为内部对象存在于析构函数中,因为它们是在构造函数中创建的,那么在出现实际错误时,可能会陷入一些

(delphi11最新学习资料) Object Pascal 学习笔记---第9章第4节(全局异常处理)

9.4 全局异常处理 ​ 如果事件处理器引发的异常停止了标准的执行流程,那么如果找不到异常处理器,是否也会终止程序呢?这确实是控制台应用程序或其他特殊用途代码结构的情况,而大多数可视化应用程序(包括基于 VCL 或 FireMonkey 库的应用程序)都有一个全局消息处理循环,它将每次执行都包裹在一个 try-except 块中,这样如果在事件处理器中引发异常,就会被捕获。 注解:请注意,如

(delphi11最新学习资料) Object Pascal 学习笔记---第9章第1节(引发异常)

9.1.2 引发异常 ​ 在 Object Pascal 编程中遇到的大多数异常都是由系统生成的,但当你在运行时发现无效或不一致的数据时,你也可以在自己的代码中引发异常。 ​ 在大多数情况下,对于自定义异常,你需要定义自己的异常类型。只需从默认异常类或上面提到的现有子类中创建一个新的子类即可: typeEArrayFull = class(Exception); ​ 在大多数情况下,不需

(delphi11最新学习资料) Object Pascal 学习笔记---第8章第7节(可视化窗体继承)

8.7 可视化窗体继承 ​ 继承不仅用于库类或你编写的类,而且在整个基于 Object Pascal 的开发环境中相当普遍。正如我们所看到的,当你在集成开发环境中创建一个窗体时,这个窗体就是一个继承自 TForm 的类的实例。因此,任何可视化应用程序都有一个基于继承的结构,即使你最终将大部分代码编写成简单的事件处理程序。 ​ 但鲜为人知的是,即使是经验丰富的开发人员,也可以从已创建的窗体继承一

(delphi11最新学习资料) Object Pascal 学习笔记---第8章第6节(安全类型转换运算符)

8.6 安全类型转换运算符 ​ 正如我们之前所见,子类的语言类型兼容性规则允许你在期望祖先类的地方使用子类。如我所提到的,反向则不可能。 ​ 现在假设TDog类有一个Eat方法,而TAnimal类中不存在此方法。如果变量FMyAnimal引用了一个狗,你可能希望能够调用这个函数。但如果你尝试调用,而变量指向的是另一个类,结果就会出错。通过显式类型转换,我们可能会导致令人讨厌的运行时错误(或者更

(delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(虚方法与动态方法)

8.4.4 继承和构造函数 ​ 正如我们所见,您可以使用inherited关键字在派生类的方法中调用基类的同名方法(或者也不同方法)。对于构造函数也是如此。在其他语言(如C++、C#或Java)中,对基类构造函数的调用是隐式和强制性的(当必须向基类构造函数传递参数时),而在Object Pascal中,调用基类构造函数并不是强制性的。 ​ 但在大多数情况下,手动调用基类构造函数是非常重要的。例

(delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(延迟绑定和多态性)

8.4.2 延迟绑定和多态性 ​ Object Pascal 函数和过程通常基于静态绑定,也称为早期绑定。这意味着方法调用是在编译或链接时解决的。面向对象编程语言允许延迟绑定或动态绑定,即根据用于调用的实例类型在运行时确定要调用的方法。 ​ 这种技术的优势被称为多态性。多态性允许你编写方法调用,并将其应用到变量上。但是,Delphi 会根据变量指向的对象类型来确定实际要调用的方法。由于前面讨论

(delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)

8.2 一个共同的基类 ​ 我们已经看到,如果要继承一个给定的基类,可以这样写: typeTNewDate = class(TDate)...end; 但是,如果省略基类并写成: typeTNewDate = class...end; ​ 在这种情况下,你的类继承自一个名为 TObject 的基类。换句话说,Object Pascal 有一个单根类层次结构,其中所有的类都直接或间