今天这里讨论一下Delphi中的面向对象编程,这里不做过多过细的讨论,主要做提纲挈领的描述,帮助自己抓做重点。

本随笔分为两部分:

一、面向对象编程

二、面向对象编程详细描述

------------------------------------------

一、面向对象编程

  下面是工程文件的:

{   面向对象编程基础
1、class的定义/类的定义
2、构造函数
3、析构函数
4、封装
5、继承
}
program oop; {$APPTYPE CONSOLE} uses
SysUtils,
Unit1 in 'Unit1.pas'; var
//定义一个类实例,或者说定义一个类对象
admin:TPersonMan;
begin { 对象的使用
1、 使用对象之前必须用构造函数创建对象
2、 对象的构造函数是为Create方法
3、 对象构造的时候,必须用类型名,因为这个时候对象还没有,所以不能
用对象实例的名字
4、 对象的析构,必须用 对象的实例名称
}
//实例化对象,访问对象前必须实例化对象
admin := TPersonMan.Create();
//访问对象的域
admin.id := ;
admin.strName := 'volcanol';
//访问对象的方法,可以省略(), 最好不要省略,因为不省略的话可以明确的表示
//访问的是对象的方法
admin.playFootball(); //Delphi的Object Pascal和 Java 、C#这样具有自动垃圾回收机制的语言不一样
//Object Pascal需要自己回收垃圾, 即在对象不再需要使用的时候,需要将对象
//的空间进行回收, 通过 Free() 方法和 Destroy() 方法实现,通常Free()方法
//更加的安全。
admin.Free();
//admin.FreeInstance(); ReadLn;
end.

  下面是单元文件unit1:

{   class类的定义
1、class关键字
2、封装
3、继承
4、构造函数
5、析构函数
} unit Unit1; interface
uses
SysUtils; type
{ 定义一个类
1、下面三种方式一样 // 1、方式1
TPerson=class(TObject)
end;
//方式2:
TPerson=class
end;
//方式3
TPerson=class; 方式1、
明确的类的父类, 通过在关键字class后面利用 (父类名称)来完成
方式2、
在Delphi的Object Pascal中所有的类都一个共同的祖先类 TObject,
这个 TObject 类,相当于盘古或者女蜗一样。
方式3、
方式3和方式2一样,只是省略了关键字 end,注意只有在定义的类型
的时候 end 关键字可以省略,其他的时候不能省略。
要点:
1、如果用方式2定义则必须定义至少一个域,否则编译报错,
报错类容为: TPerson 未完全定义。
2、如果用方式3定义,则必须显式的指出类的父类型
Type
TxxxObject=class(TObject); //正确的定义方法 }
{
Type
TxxxObject=class; //编译报错,类型没有定义完全。
}
TPerson=class
//类的域定义, 注意Delphi中Object Pascal的域
id:integer; //对象的封装,但是这里没有完全体现封装的真正“意义”。
end; TPersonMan=class(TPerson) //演示继承类的定义方法
strName:shortString; //下面的两种声明方法的方式需要注意都可以,一般推荐使用第一种方式
//因为这样更能表示这是一个方法。
procedure playFootball();
//procedure playFootBall;
end; implementation { 类方法的实现
1、 和普通的方法一样,类的方法也需要在实现中进行定义,否则将不能调用
2、 注意定义类的方法的时候,需要指定方法属于哪一个类," . " 域操作符
来实现。
类名.方法名
}
procedure TPersonMan.playFootball;
begin
WriteLn('I can play football :) !!!');
end; end.

二  面向对象编程

  下面的工程对面向对象编程进行了更多的描述。

下面是工程文件:

{    面向对象详细
1、方法特性 static、virtual、dynamic、message
2、访问特性控制: private、public、
3、域的 "属性" 特性
} program OopDetail; {$APPTYPE CONSOLE} uses
SysUtils,
Unit1 in 'Unit1.pas'; var
//定义两个对象
person:TPerson;
teachar1:TTeachar; begin
//实例化变量
person :=TPerson.Create();
//初始化域
person.gender := Male;
person.name := 'volcanol';
person.height := 1.75;
person.weight := ;
person.nationality := China;
person.education := Primary;
person.profession := Unemployment;
//方法
person.eat();
person.language();
person.playBall(); WriteLn(''); //实例化对象
teachar1 := TTeachar.Create();
//初始化域
teachar1.gender := Female;
teachar1.name := 'Lily';
teachar1.height := 1.65;
teachar1.weight := ;
teachar1.nationality := England;
teachar1.education := University;
teachar1.profession :=Teachar; { 方法
1、注意调用 override 的方法的输出
}
teachar1.language();
teachar1.playBall();
teachar1.teaching();
teachar1.prepareLesson();
teachar1.testLesson(); ReadLn;
end.

  下面是单元文件:

{   class man 的定义
1、定义一个人的基类
2、基类的方法具有static、virtual、dynamic、message
} unit Unit1; interface
uses
SysUtils; type
//定义一个表示性别的枚举类型
TGender=(Male,Female);
//定义一个表示国籍的枚举类型
TNation=(China,England,American);
//定义一个表示学历的枚举类型
TEducation=(Primary,Junior,Senior,University);
//定义一个职业的枚举类型
TProfession=(Unemployment,Teachar,Docotor,Lawyer,Firefight); //****************************************************
// 定义一个人的类
// 1、人的属性 --- 域
// 性别、姓名、身高、体重、国籍、学历等
// 2、人的能力 --- 方法
// 外语、吃饭、打球等
//*****************************************************
TPerson=class
// 域
gender : TGender;
name : shortstring;
height : single;
weight : single;
nationality : TNation;
education : TEducation;
profession: TProfession; // 方法
//静态方法 静态方法不能被覆盖
procedure eat();
//虚方法 父类的虚方法可以在子类中被覆盖
procedure language(); virtual;
procedure playBall(); virtual;
end; TTeachar=class(TPerson)
//域 // 方法
{ 方法的覆盖:
1、 通过 override 关键字表示
2、方法的覆盖就是屏蔽父类的同名方法,注意与方法的重载 overload 的
区别
3、
}
procedure language(); override;
procedure playBall(); override;
procedure teaching();
procedure prepareLesson();
procedure testLesson();
end; implementation //***********************************************************
// 实现 TPerson类的方法
procedure TPerson.eat();
begin
WriteLn('I can eating.');
end; procedure TPerson.playBall();
begin
WriteLn('I can play ball.');
end; procedure TPerson.language();
begin
WriteLn('I can only speak one languave.');
end; //***********************************************************
// 实现 TTeacher 类的方法
procedure TTeachar.language();
begin
WriteLn('I can speak lot of languave.');
end; procedure TTeachar.playBall();
begin
WriteLn('I can not play ball.');
end; procedure TTeachar.teaching();
begin
WriteLn('I am a Chinese teachar.');
end; procedure TTeachar.prepareLesson();
begin
WriteLn('I am prepare math lesson.');
end; procedure TTeachar.testLesson();
begin
WriteLn('I am testing English.');
end; end.

欢迎转载本系列文章,转载请注明来源。

Delphi_09_Delphi_Object_Pascal_面向对象编程的更多相关文章

  1. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  2. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  3. PHP 面向对象编程和设计模式 (1/5) - 抽象类、对象接口、instanceof 和契约式编程

    PHP高级程序设计 学习笔记 2014.06.09 什么是面向对象编程 面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构.OOP 的一条基本原则是计算 ...

  4. python基础-面向对象编程

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...

  5. 面向对象编程(OOP)

    什么是面向对象编程,对于面向对象编程与面向过程编程的解释随处可见,个人认为对面向对象编程解释最好的一个定义是:依赖倒转原则是面向对象编程的标志,面向对象编程是一种思想,无论使用哪一种编程语言,如果在编 ...

  6. python 学习笔记7 面向对象编程

    一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...

  7. 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶

    Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...

  8. 进击的Python【第六章】:Python的高级应用(三)面向对象编程

    Python的高级应用(三)面向对象编程 本章学习要点: 面向对象编程介绍 面向对象与面向过程编程的区别 为什么要用面向对象编程思想 面向对象的相关概念 一.面向对象编程介绍 面向对象程序设计(英语: ...

  9. 第二章 Matlab面向对象编程基础

    DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...

随机推荐

  1. Java中,异常的处理及抛出

    首先我们需要知道什么是异常? 常通常指,你的代码可能在编译时没有错误,可是运行时会出现异常.比如常见的空指针异常.也可能是程序可能出现无法预料的异常,比如你要从一个文件读信息,可这个文件不存在,程序无 ...

  2. ubuntu 下安装scrapy

    1.把Scrapy签名的GPG密钥添加到APT的钥匙环中: sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 6272 ...

  3. javaScript中的小细节-script标签中的预解析

    首先介绍预解析,虽然预解析字面意思很好理解,但是却是出坑出的最多的地方,也是bug经常会有的地方,利用好预解析的特性可以解决很多问题,并且提高代码的质量及数量,浏览器在解析代码前会把变量的声明和函数( ...

  4. Oracle使用触发器和mysql中使用触发器的比较——学习笔记

    一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...

  5. wireshark 相关提示

    Packet size limited during capture      提示说明标记的包没有抓全,在某些操作系统中,默认只抓96个字节,tcpdump中有"-s"参数可用于 ...

  6. 虚拟机体验之 VirtualBox 篇 —— 性能强大的经典架构

    前两篇体验了 QEMU 和经过 KVM 加速的 QEMU,并体验了第三方虚拟机管理工具 virt-manager,让我们见识了开源社区的强大和开源虚拟机软件的高质量和高性能.这一篇,我来剖析一下 Vi ...

  7. java中文乱码解决之道(九)-----总结

    乱码,我们前台展示的杀手,可能有些朋友和我的经历一样:遇到乱码先按照自己的经验来解决,如果没有解决就google,运气好一搜就可以解决,运气不好可能够你折腾一番了.LZ之所以写这个系列博客就是因为遇到 ...

  8. Spark 生态系统组件

    摘要: 随着大数据技术的发展,实时流计算.机器学习.图计算等领域成为较热的研究方向,而Spark作为大数据处理的“利器”有着较为成熟的生态圈,能够一站式解决类似场景的问题.那你知道Spark生态系统有 ...

  9. oracle11g 重装操作系统后,如何利用原有oracle表空间文件还原数据库

    最近由于系统重装,在还原dmp备份文件时,由于数据原因(用exp命令导出时表没有导出全部),导致系统不能正常运行.根据网上的信息和个人实际情况,做个记录,便于后用. oracle 导出空表方法: 1. ...

  10. 【.net深呼吸】(WCF)OperationContextScope 的用途

    一个WCF服务可以实现多个服务协定(服务协定实为接口),不过,每个终结点只能与一个服务协定关联,并指定调用的唯一地址.那么,binding是干吗的?binding是负责描述通信的协议,以及消息是否加密 ...