任何一门语言,只要具备了"封装,继承,多态"这三项基本能力,不管其实现方式是直接或曲折、复杂或简洁,就可以称之为“面向对象”的语言。

Delphi当年的迅速走红,是以其RAD快速开发吸引程序员的目光。这无疑是它最吸引人的优势,但同时也让人误以为delphi只是vb的高级版本,从而忽视了其面向对象的特性。

其实Pacscal发展到Delphi,已经完全具备了面向对象的所有特点:允许自定义类,类可以继承(单继承),允许方法重载/覆写,可以定义接口,类可以实现接口,允许定义静态方法(即class方法),虚方法,抽象类...等等,对于delphi怀有偏见的朋友,你还会怀疑delphi的面向对象能力吗?

下面是一些演示代码:
1.先定义一个基类TPeople

代码 

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->unit UPeople;

interface

type
TPeople = class(TObject) private
_name:string; //私成成员定义
procedure Set_Name(value:string);//Name属性的set方法定义
function Get_Name:string; //Name属性的get方法定义 protected
function Get_Sex:Boolean;virtual;abstract; //定义抽象虚方法,由子类去实现 public
property Name:string read Get_Name write Set_Name; //定义Name属性
property Sex:Boolean read Get_Sex; //定义Sex只读属性(该属性并未实现,而是交由子类去实现)
class function ToString:string; //类方法,有点象c#中的static静态方法
procedure ShowName;//公用实例方法
end; //实现部分
implementation procedure TPeople.Set_Name(value:string);
begin
_name := value;
end; function TPeople.Get_Name:string;
begin
result := _name;
end; class function TPeople.ToString:string;
begin
result := 'This is a People Class';
end; procedure TPeople.ShowName;
begin
Writeln('姓名:' + _name);
end;
end.

2.再定义一个子类TMan

代码 

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->unit UMan;

interface

uses
UPeople ; type
TMan = class(TPeople) constructor Create(name:string); overload ; //重载构造函数 private
_sex:Boolean; protected
function Get_Sex:Boolean; override; public
function ToString:string; //实例方法 end; implementation constructor TMan.Create(name:string); //注意写法:实现的时候不用加overload关键字
begin
inherited Create;
_sex := true; //男性强制定义为true
Self.Name := name; end; function TMan.Get_Sex:Boolean;
begin
result := _sex;
end; function TMan.ToString:string;
begin
result := '这是TMan中的ToString方法';
end; end.

3.再来一个子类TWoman

代码 

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->unit UWoman;

interface

uses
UPeople,UICook; type
TWoman = class(TPeople,ICook) constructor Create(name:string); overload ; private
_sex:Boolean; protected
function Get_Sex:Boolean; override; public
procedure Cook;//接口的方法实现定义
procedure ShowName;overload; //如果Class是从TObject继承的,又想实现接口的话,必须实现下面这三个function,
//如果想偷懒的话,把UPeople改成从TInterfacedObject继承就可以省掉这个步骤了
function _AddRef:Integer; stdcall;
function _Release:Integer;stdcall;
function QueryInterface(const IID:TGUID;out Obj):HResult; stdcall;
end; implementation function TWoman._AddRef:Integer;
begin
result :=-;
end; function TWoman._Release:Integer;
begin
result :=-;
end; function TWoman.QueryInterface(const IID:TGUID;out Obj):HResult;
const
E_NOINTERFACE = $;
begin
if GetInterface(IID,Obj) then
Result :=
else
Result := -; {E_NOINTERFACE}
end; constructor TWoman.Create(name:string);
begin
inherited Create;
_sex := false;
Self.Name := name;
end; function TWoman.Get_Sex:Boolean;
begin
result := _sex;
end; procedure TWoman.ShowName;
begin
Writeln('女人总是喜欢搞点花样,所以重载一下哈.')
end; procedure TWoman.Cook;
begin
Writeln('因为我实现了ICook接口,所以我会做饭:)')
end; end.

注意,TWoman这个子类实现了接口ICook,其定义如下:

4.ICook接口

代码 

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->unit UICook;

interface

type
ICook = interface //定义一个接口
procedure Cook;//接口的方法定义
end; implementation end.

5.放到ConsoleApplication中测试一把:

代码

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->program ClassDemo;

{$APPTYPE CONSOLE}

uses
SysUtils,
UPeople in 'UPeople.pas',
UMan in 'UMan.pas',
UWoman in 'UWoman.pas',
UICook in 'UICook.pas'; var
aPeople:TPeople;
aMan:TMan;
aWoman:TWoman;
aCook:ICook; begin
aPeople := TPeople.Create;
aPeople.Name := 'jimmy.yang';
Writeln(aPeople.Name);
Writeln(TPeople.ToString);//调用静态方法
aPeople.ShowName; Writeln('----------------------------------------'); aMan := TMan.Create('杨俊明');
Writeln(aMan.Name);
Writeln(aMan.Sex);
aMan.ShowName; //通过继承得来的方法
Writeln(aMan.ToString);//TMan实例中的对象方法 Writeln('----------------------------------------'); aWoman := TWoman.Create('小龙女');
Writeln(aWoman.Name);
Writeln(aWoman.Sex);
aWoman.ShowName; //调用重载后的方法
aWoman.Cook;//实现接口得来的方法
Writeln('----------------------------------------');
aCook := ICook(aWoman);//类还可以转化为接口
aPeople.Free;
aPeople:= TWoman.Create('翠花'); //同样也允许子类创建得到父类
aPeople.ShowName;
aWoman.Free;
aWoman := TWoman(aPeople);
aWoman.Cook;
Readln;
end.

运行结果:
jimmy.yang
This is a People Class
姓名:jimmy.yang
----------------------------------------
杨俊明
TRUE
姓名:杨俊明
这是TMan中的ToString方法
----------------------------------------
小龙女
FALSE
女人总是喜欢搞点花样,所以重载一下哈.
因为我实现了ICook接口,所以我会做饭:)
----------------------------------------
姓名:翠花
因为我实现了ICook接口,所以我会做饭:)

重温Delphi之:面向对象的更多相关文章

  1. 重温delphi之控制台程序:Hello World!

    原文:重温delphi之控制台程序:Hello World! 这二天用c#开发ActiveX时,发现不管怎么弄,c#就是没办法生成ocx的纯正activeX控件,而且还要强迫用户安装巨大的.net f ...

  2. Delphi的面向对象编程基础笔记

    1.面向对象.一门面向对象的编程语言至少要实现以下三个OOP的概念 封装:把相关的数据和代码结合在一起,并隐藏细节.封装的好处是利用程序的模块化,并把代码和其他代码分开 继承:是指一个新的类能够从父类 ...

  3. 重温delphi之:如何将Bitmap位图与base64字符串相互转换

    先引用delphi自带的单元 uses EncdDecd; 然后就可以使用下面二个函数了: by 菩提树下的杨过 http://yjmyzz.cnblogs.com/ ///将Bitmap位图转化为b ...

  4. Delphi面向对象编程

    一.面向对象介绍 OOP是使用独立的对象(包含数据和代码)作为应用程序模块的范例.虽然OOP不能使得代码容易编写,但是它能够使得代码易于维护.将数据和代码结合在一起,能够使定位和修复错误的工作简单化, ...

  5. Delphi 2 Unleashed (一) 介绍

    原书作者是作者是 Charles Calvert,国内翻译为<Delphi 2 程序设计大全>,由横空翻译组翻译,机械工业出版社1997年12月出版,看网上评论和介绍,该书是系统学习 De ...

  6. 转:Delphi的类与继承(VB与delphi比较)

    既然已经做出了com程序用delphi来开发的决定,那当然就要对delphi进行一些深入的了解.有人说delphi是一个用控件堆砌起来的工具,和vb没什么两样:也有人说dephi实际上是面向过程的,他 ...

  7. 谈谈Delphi中的类和对象1---介绍几个概念 && 对象是一个地地道道的指针

    参考:http://blog.163.com/liang_liu99/blog/static/88415216200952123412180/ 以下的介绍主要针对的是Delphi的面向对象的知识,可能 ...

  8. Object Pascal 面向对象的特性

    2 面向对象的特性 在软件系统开发过程中,结构分析技术和结构设计技术具有很多优点,但同时也存在着许多难以克服的缺点.因为结构分析技术和结构设计技术是围绕着实现处理功能来构造系统的,而在系统维护和软件升 ...

  9. 比较C++、Java、Delphi声明类对象时候的相关语法

    同学们在学习的时候经常会遇到一些问题,C++.Java.Delphi他们到底有什么不一样的呢?今天我们来比较C++.Java.Delphi声明类对象时候的相关语法.希望对大家有帮助! C++中创建对象 ...

随机推荐

  1. P1734 最大约数和

    题目描述 选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大. 输入输出格式 输入格式: 输入一个正整数S. 输出格式: 输出最大的约数之和. 输入输出样例 输入样例#1: 复 ...

  2. AI 矩阵求导

    矩阵求导 参考链接: https://en.wikipedia.org/wiki/Matrix_calculus#Scalar-by-vector_identities

  3. treap学习笔记

    treap是个很神奇的数据结构. 给你一个问题,你可以解决它吗? 这个问题需要treap这个数据结构. 众所周知,二叉查找树的查找效率低的原因是不平衡,而我们又不希望用各种奇奇怪怪的旋转来使它平衡,那 ...

  4. Java多线程编程模式实战指南(三):Two-phase Termination模式

    停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程时还有一些额外的细节需要考虑,如待停止的线程处于阻塞(等待锁)或者等待状态(等待其它线程) ...

  5. chrome浏览器添加vue-devtools扩展

    1,在百度网盘中下载压缩包,网盘地址:https://pan.baidu.com/s/1i6UdvCD,密码:nvfe 2,将压缩包解压到F盘,F:\chromeVue插件 3,复制文件地址,F:\c ...

  6. 加解密工具类(含keystore导出pfx)

    java代码如下: package sign; import java.io.FileInputStream; import java.io.FileOutputStream; import java ...

  7. 微软下一代Web前端技术Blazor(C#编译为WebAssembly)

    W3C Web标准化机构在制定下一代的网页技术WebAssembly.目前版本是1.0,主流浏览器的最新版本都已经支持.其特点是浏览器可以执行编译后的二进制程序,不需要像之前的程序,浏览器下载Java ...

  8. SQL SERVER中DBLINK的实现

    exec sp_addlinkedserver 'CantennFlexPsApp' , '' , 'SQLOLEDB' , '目标数据库的IP' exec sp_addlinkedsrvlogin ...

  9. 利用数据库触发器让字段与自增长Id相关联

    十年河东,十年河西,莫欺少年穷 学无止境,精益求精 今天是数据库脚本类的代码,所以不想过多阐述 如下数据表: create table Card( Id ,) primary key, CardNo ...

  10. 汇编 STOSB, STOSW, STOSD指令

    知识点: 汇编指令 STOSB STOSW STOSD 一.汇编指令STOSB 004113AC 8DBD B4FEFFFF LEA EDI,DWORD PTR SS:[EBP-14C] 004113 ...