【delphi11】delphi进阶【四、面向对象编程(OOP)】

        面向对象编程(OOP)是现代编程中的一个核心概念,尤其在使用像 Delphi 这样的面向对象的语言时。它基于三个主要原则:封装、继承和多态。我们将通过 Delphi 编程语言来探讨这些概念。

目录

类和对象

封装(Encapsulation)

继承(Inheritance)

重写方法

构造和析构

析构函数的注意事项

注意事项

多态(Polymorphism)

使用方法

注意事项

使用技巧

工厂类代码示例

基类和子类

实现工厂类

使用工厂类


类和对象

  1. 类(Class)

    • 类是对象的蓝图或模板。它定义了一组属性(用于存储数据)和方法(用于执行操作)。
    • 在 Delphi 中,类是使用 class 关键字定义的。

        声明一个类

        一个基本的 Delphi 类声明包括属性、方法和构造函数/析构函数的定义。以下是一个简单类的例子:

typeTPerson = classprivateFName: string; // 私有属性FAge: Integer;publicconstructor Create(Name: string; Age: Integer);destructor Destroy; override;procedure DisplayInfo; // 公开方法property Name: string read FName write FName; // 属性访问器property Age: Integer read FAge write FAge;end;

         构造函数和析构函数

        构造函数 (constructor) 用于初始化类的新实例。

        析构函数 (destructor) 用于清理在对象销毁时需要释放的资源

 

constructor TPerson.Create(Name: string; Age: Integer);
beginFName := Name;FAge := Age;
end;destructor TPerson.Destroy;
begin// 清理代码inherited;
end;

        方法:

        方法可以是过程(procedure)或函数(function),用于定义类的行为。

procedure TPerson.DisplayInfo;
beginShowMessage('Name: ' + FName + ', Age: ' + IntToStr(FAge));
end;

         

        属性:

        属性是对内部字段的封装,提供了读取(read)和写入(write)的接口。

property Name: string read FName write FName;
property Age: Integer read FAge write FAge;
  1. 对象(Object)

    • 对象是类的实例。当你根据类创建一个实际的实例时,你就创建了一个对象。
    • 在 Delphi 中,对象通常通过调用类的构造函数来创建

封装(Encapsulation)

  • 封装是将数据(属性)和操作该数据的代码(方法)捆绑在一起的做法。
  • 它提供了一种方式来限制对对象内部状态的直接访问,并可以通过公共方法来控制对这些状态的访问。
  • 在 Delphi 中,你可以通过定义 privateprotected 属性和方法来实现封装。

继承(Inheritance)

  • 继承允许一个类(子类)继承另一个类(父类)的特性,如方法和属性。
  • 这意味着你可以创建一个通用的父类,然后创建更专门化的子类。
  • 在 Delphi 中,继承是使用 TObject 类或其他已定义类作为基类来实现的。

        在 Delphi 中,继承是面向对象编程的一个核心概念,它允许一个类(子类)继承另一个类(基类或父类)的属性和方法。这样,子类可以扩展或修改基类的行为。下面我们来详细探讨 Delphi 中继承的写法、高级技巧以及注意事项。

        在 Delphi 中,继承通过在类声明中指定一个基类来实现。子类继承了基类的所有公共(public)、保护(protected)和发布(published)成员。

typeTAnimal = classpublicprocedure Speak; virtual;end;TDog = class(TAnimal)publicprocedure Speak; override;end;

         在上面的例子中,TDog 类继承自 TAnimal 类。TDog 重写了 Speak 方法,这是多态的一个典型应用。

重写方法

  • 子类可以重写基类中定义为 virtualdynamic 的方法。
  • 使用 override 关键字来指明方法被重写。
procedure TDog.Speak;
begininherited;  // 调用基类的方法// 添加额外的功能
end;

构造和析构

constructor TDog.Create;
begininherited Create;// 初始化代码
end;destructor TDog.Destroy;
begin// 清理代码inherited;
end;

析构函数的注意事项

  1. 调用基类的析构函数:在子类的析构函数中,应调用基类的析构函数,以确保基类的资源得到正确释放。这同样通过 inherited 关键字实现。

  2. 资源释放顺序:首先执行子类的析构函数,然后执行基类的析构函数。

  3. 避免资源泄漏:确保子类的析构函数正确清理所有子类特有的资源。

typeTDog = class(TAnimal)publicdestructor Destroy; override;end;destructor TDog.Destroy;
begin// 子类特有的清理代码inherited; // 调用基类的析构函数
end;
  • 在 Delphi 中,虽然构造函数和析构函数的命名是自由的,但最常见的习惯是使用 CreateDestroy
  • 当重写构造函数和析构函数时,确保使用 override 关键字。
  • 在构造函数和析构函数中,适当使用 inherited 是非常重要的。这确保了基类的构造函数和析构函数被正确地调用,从而维护了对象的完整性。

通过遵循这些准则,你可以确保在使用 Delphi 进行面向对象编程时,对象的生命周期得到正确的管理。这对于编写可靠、稳定的应用程序至关重要。

注意事项

  • 方法重写:确保使用 override 关键字重写基类中的 virtualdynamic 方法。
  • 调用 inherited:在重写方法时,适当地使用 inherited 调用基类实现。
  • 构造函数和析构函数:正确管理构造函数和析构函数的继承,特别是在涉及资源管理时。
  • 类型兼容性:子类的实例可以赋值给基类类型的变量或参数,但反之不行。
  • 多重继承:Delphi 不支持多重继承。可以使用接口(interface)作为替代方案。

多态(Polymorphism)

  • 多态是指允许不同类的对象以自己的方式响应相同的消息(或方法调用)。
  • 这通常通过方法重写(覆盖父类中的方法)和接口(定义一组方法规范)实现。
  • 在 Delphi 中,你可以通过重写方法(使用 override 关键字)来实现多态

使用方法

  1. 方法重写(Overriding)

    • 在基类中声明虚方法(使用 virtual 关键字)。
    • 在派生类中重写这些方法(使用 override 关键字)。
typeTAnimal = classpublicprocedure Speak; virtual;end;TDog = class(TAnimal)publicprocedure Speak; override;end;

接口(Interface)

  • 定义一个接口。
  • 创建实现该接口的类。
  • 使用接口类型的引用来调用实现了该接口的不同类的方法。
typeISpeak = interfaceprocedure Speak;end;TDog = class(TInterfacedObject, ISpeak)procedure Speak;end;

注意事项

  1. 虚方法

    • 只有被声明为 virtualdynamicabstract 的方法才可以被重写。
  2. 调用 inherited

    • 在重写的方法中使用 inherited 来调用基类的实现,除非你有意改变整个行为。
  3. 接口引用计数

    • 当使用接口时,Delphi 自动处理对象的引用计数。确保你了解引用计数和接口的管理方式。
  4. 方法隐藏

    • 如果在子类中声明了与基类同名的方法而没有使用 override 关键字,这将导致方法隐藏而非重写。

使用技巧

  1. 代码重用和扩展性

    • 使用多态可以在不更改现有代码的情况下扩展功能,这对于维护大型应用程序非常有用。
  2. 解耦

    • 使用接口可以降低类之间的耦合度,使得代码更加模块化。
  3. 测试和模拟

    • 在单元测试中,你可以使用多态来创建模拟对象(Mock Objects),这对于测试特定功能而不依赖于其他部分非常有用。
  4. 设计模式应用

    • 多态是许多设计模式(如工厂模式、策略模式等)的基础。
typeTAnimal = classpublicprocedure Speak; virtual;end;TDog = class(TAnimal)publicprocedure Speak; override;end;procedure TAnimal.Speak;
beginShowMessage('An animal makes a sound');
end;procedure TDog.Speak;
beginShowMessage('A dog barks');
end;varPet: TAnimal;
beginPet := TDog.Create;tryPet.Speak;  // 输出:A dog barksfinallyPet.Free;end;
end;

工厂类代码示例

        要在 Delphi 中实现一个展示继承和多态特性的工厂类,我们可以创建一个基类和几个继承自该基类的子类。然后,使用一个工厂类来根据不同的条件创建和返回这些子类的实例。以下是一个简单的示例:

基类和子类

首先,定义一个基类 TAnimal 和两个继承自它的子类 TDogTCat

type// TAnimal 是一个抽象基类TAnimal = classpublic// 声明一个抽象的虚方法 Speakfunction Speak: string; virtual; abstract;end;// TDog 是 TAnimal 的子类TDog = class(TAnimal)public// 重写基类的 Speak 方法function Speak: string; override;end;// TCat 也是 TAnimal 的子类TCat = class(TAnimal)public// 同样重写基类的 Speak 方法function Speak: string; override;end;// 实现 TDog 的 Speak 方法
function TDog.Speak: string;
beginResult := 'Dog says: Woof!';
end;// 实现 TCat 的 Speak 方法
function TCat.Speak: string;
beginResult := 'Cat says: Meow!';
end;

实现工厂类

接下来,我们定义一个工厂类 TAnimalFactory,用于根据不同的条件创建 TAnimal 类的不同子类的实例。

type// 动物类型的枚举TAnimalType = (atDog, atCat);// TAnimalFactory 是用于创建 TAnimal 对象的工厂类TAnimalFactory = classpublic// 静态方法 CreateAnimal 用于根据动物类型创建相应的动物实例class function CreateAnimal(AnimalType: TAnimalType): TAnimal;end;// 实现 TAnimalFactory 的 CreateAnimal 方法
class function TAnimalFactory.CreateAnimal(AnimalType: TAnimalType): TAnimal;
begincase AnimalType ofatDog: Result := TDog.Create; // 创建 TDog 实例atCat: Result := TCat.Create; // 创建 TCat 实例elseResult := nil; // 未知类型返回 nilend;
end;

 

使用工厂类

最后,展示如何使用 TAnimalFactory 来创建不同的动物实例并调用它们的 Speak 方法。

varAnimal: TAnimal;AnimalType: TAnimalType;
begin// 选择创建一个狗的实例AnimalType := atDog;// 使用工厂类创建动物实例Animal := TAnimalFactory.CreateAnimal(AnimalType);tryif Assigned(Animal) thenShowMessage(Animal.Speak); // 显示: Dog says: Woof!finallyAnimal.Free; // 释放动物实例end;// 这里可以重复上述过程来创建和使用不同类型的动物
end;

        在这个示例中,TAnimalFactory 根据传入的动物类型枚举值动态地创建 TAnimal 类的合适子类实例。这展示了多态的使用,因为 Speak 方法的具体行为取决于对象的实际类别,而这些对象都是从同一个基类 TAnimal 继承的。通过这种方式,我们可以在不修改现有代码的情况下轻松添加新的动物类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HttpUtils——助力高效网络通信

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可: 1、创建HttpClient对象。 2、创建请求方法的实例,并指定请求URL。如果需要发送GET请求, 创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。 3…

【ECharts】折线图

文章目录 折线图1折线图2折线图3示例 参考: Echarts官网 Echarts 配置项 折线图1 带X轴、Y轴标记线,其中X轴是’category’ 类目轴,适用于离散的类目数据。 let myChart echarts.init(this.$refs.line_chart2); let yList [400, 500, 6…

关于“Python”的核心知识点整理大全31

目录 12.4.2 在屏幕上绘制飞船 alien_invasion.py ​编辑12.5 重构:模块 game_functions 12.5.1 函数 check_events() game_functions.py alien_invasion.py 12.5.2 函数 update_screen() game_functions.py alien_invasion.py 12.6 驾驶飞船 12.6.1 响应…

RESTful简介与C/C++实现

一、RESTful简介 RESTful,全称为Representational State Transfer,是一种软件架构风格和设计理念,而不是一种标准。它主要用于Web服务的设计和开发,强调资源的状态表示和状态转移。RESTful风格的设计使得Web服务更加简洁、清晰和…

msvcp120.dll丢失的多种详细有效解决方法

在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是“msvcp120.dll丢失”。那么,msvcp120.dll到底是什么?为什么会出现丢失的情况?丢失后会对电脑产生什么影响?本文将为您详细解答这些问题&#…

HarmonyOS笔记1

修改字体颜色 在Text里边,按一下 . 就行了,按点号会自动提示 fontColor 函数参数给‘#36D’可以把‘Hello World’调成蓝色 onClick(()>{}) 按钮 如何打印第二句话 Text方法 2023年12月21日11:26:52

项目从0到1,架构选型 :单体架构优先考虑

当我听到关于团队使用微服务架构的故事时,我注意到了一个共同的现象。 几乎所有成功的微服务故事都是从一个过于庞大的庞然大物开始的,后来这个庞然大物被拆分了我所听说的几乎所有从零开始构建微服务系统的案例,最终都陷入了严重的麻烦。 …

Mybatis Mapper XML文件-插入,更新,删除(insert, update and delete)

数据修改语句&#xff08;插入、更新和删除&#xff09;在实现上非常相似&#xff1a; <insertid"insertAuthor"parameterType"domain.blog.Author"flushCache"true"statementType"PREPARED"keyProperty""keyColumn&quo…

强烈推荐的前端学习资源,先收藏!

今天分享一些个人收藏的前端学习资源&#xff0c;按一下几个维度简单划分了下&#xff0c;有 3D、框架、构建工具等等。由于这些地址都是我个人收藏的&#xff0c;所以带有一些强烈的主观意识&#xff0c;还有很多优秀的网址没有收录进来&#xff0c;会不断更新的&#xff0c;欢…

系统分析师(软考)知识点整理(二)

会计相关 会计是指记录、分类、汇总、计量和报告发送在企业经济活动中的财务数据的行为 #mermaid-svg-YBI5YPWzqWhRB4kI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YBI5YPWzqWhRB4kI .error-icon{fill:#552222…

亚马逊鲲鹏系统引爆广告点击率提升秘籍

在竞争激烈的电商市场&#xff0c;提高广告点击率成为各大卖家争相追求的目标。而如今&#xff0c;亚马逊鲲鹏系统的强大功能再次为卖家们打开了广告优化的新大门。其中&#xff0c;搜索广告功能更是成为提高关键词排名的利器。本文将详细介绍如何通过亚马逊鲲鹏系统实现点击广…

Scrum项目管理流程及免费敏捷工具

​ 项目启动&#xff1a; 团队明确项目愿景、目标和范围&#xff0c;确定项目范围和优先级&#xff0c;并建立团队以及开展初步计划。 制定产品待办事项清单&#xff08;Product Backlog&#xff09;&#xff1a; 定义项目所需功能、任务和需求列表&#xff0c;并按优先级排序…

多维时序 | MATLAB实现KOA-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现KOA-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现KOA-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现KOA-CNN-B…

定制@ResponseBody

自定义注解类&#xff08;annotation&#xff09;&#xff1a; IgnoreResult该类用于忽略不使用ResponseBody package com.baizhi.mall.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Retention…

2312d,D语言单元测试等

原文 我最近决定在"系统编程"领域试些小众语言.我已用了Java,Dart和Kotlin等高级语言编程多年了(并试了许多其他相同级别或更高级的语言),需要扩大视野,因为对某些类型应用,这些语言并不是最好的工具. 这篇博文中,我想重点介绍D语言这里,经过一些初步实验,它比其他语…

Vue3 的效率提升主要表现在哪些方面?

Vue3带来了许多性能优化和效率提升的特性。本文将重点讨论Vue3在静态提升、预字符串化、缓存事件处理函数、Block Tree和PatchFlag方面的改进。我们将通过对比Vue2和Vue3的编译结果来说明这些方面的效率提升。 静态提升 在Vue2中&#xff0c;每次渲染时都会重新创建VNode节点…

linux | 软连接与硬链接 | 实测

很多知识&#xff0c;我们都是通过学习其他博主的博客&#xff0c;可是学习的过程 常常需要辩证的去辨别真伪。这很耗精力&#xff0c;最好的方法就是实践去检测。 软链接 和 应链接 在 linux 上操作非常重要 常见场景&#xff1a;最重要的就是&#xff0c;做备份&#xff0c;尤…

Talk | 约翰霍普金斯大学博士生魏晨: De-Diffusion-文本是不同模态的沟通桥梁

本期为TechBeat人工智能社区第557期线上Talk。 北京时间12月20日(周三)20:00&#xff0c;约翰霍普金斯大学博士生—魏晨的Talk已准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “De-Diffusion-文本是不同模态的沟通桥梁题”&#xff0c;介绍了她的团队在如…

面向对象程序设计(异常,RTTI,泛型,动态加载)

异常 首先&#xff0c;我们知道Java中的异常分为两大类&#xff1a;编译时异常和运行时异常。编译时异常通常是一些在编写代码时就能发现的错误&#xff0c;比如文件找不到之类的&#xff1b;而运行时异常则是在程序运行过程中出现的&#xff0c;比如除零错误。 我们可以使用…

Linux---进程状态

目录 一、系统进程状态介绍 1.运行状态 2.阻塞状态 3.挂起状态 二、Linux中的进程状态 1.R (running) 2.S (sleeping) 3.D&#xff08;disk sleep&#xff09; 4.T&#xff08;stopped&#xff09; 5.t&#xff08;tracing stop&#xff09; 6.X&#xff08;dead&am…