Delphi的类与继承
既然已经做出了com程序用delphi来开发的决定,那当然就要对delphi进行一些深入的了解。有人说delphi是一个用控件堆砌起来的工具,和vb没什么两样;也有人说dephi实际上是面向过程的,他的面向对象并不彻底。实际生活中持这两种观点的人不在少数,就拿我认识的一个非常好的程序员来说吧,他很早就开始用vb,到后来接触到delphi,并且用delphi也开发了不少程序,但吃惊的是这些程序全都是面向过程的。我并没有贬低这种做法的意思,我想说的是:好的delphi控件+好的编程规范+优秀的vcl 也能造就很多实用的程序。况且他也是位非常好的vb程序员,俗话说仅能使用vb还显得很初级,但用vb编写出非常稳定可靠的企业应用,那就非常优秀。但这样的人很少很少,为什么?因为企业级应用往往要求较高的可靠性和可扩展性,其中可靠性就是vb的弱点,很多时候为了实现一个稍微复杂的应用,vb就需要大量的第三方控件,大量的windows api调用(这些api在后期很难阅读与维护),大量的看似相互独立但无须申明就可以四处调用的模块,再加上一堆的全局变量,最终的局面是程序越大,程序员的脑袋就越大。但有人就说了,那vb不也有类吗?是啊,它是有,但一切面向对象的思想都在这个所谓的类上找不到影子:什么重载,虚函数,重写,继承...等等。而这些delphi都有。当然了,vb毕竟是一个易学易用的语言,从一开始,微软就没说过他是一个全面向对象的语言(这也包括最终的vb6.1)。再有就是可扩展性,用vb开发的程序一般可扩展性都比较低,这是不争的事实,我想就不用多说了,谁身在其中,谁自然最清楚。vb中好的程序员,多半是具有很高的编程技巧,能将vb的弱点降到最低的人,他们往往很早就接触vb,感情释然,积累也很丰富,放不下了。而我呢,又是个木瓜脑袋,是很难达到那些牛人的水平了,所以还是决定彻底放弃vb去选择一个优秀的开发工具,那就是delphi。
从最初的c语言到vb,又从vb 到delphi,再从delphi到c#,最后又回过头来看delphi。虽说delphi的面向对象特性没有c#那样彻底,但delphi至少实现了80%-90%的oop特性。不废话了,先来看两个delphi下的类实现:
首先是一个表示人的基类,定义如下:
2
3 interface
4
5 type
6 Person=class //基类
7 private
8 name:string; //私有变量(姓名,性别,身高,体重)
9 sex:string;
10 year:integer;
11 tall:integer;
12 weight:integer;
13 function get_name:string; //声明返回和设置属性的函数
14 procedure set_name(Value:string); //以下同
15 function get_sex:string;
16 procedure set_sex(Value:string);
17 function get_year:integer;
18 procedure set_year(Value:integer);
19 function get_tall:integer;
20 procedure set_tall(Value:integer);
21 function get_weight:integer;
22 procedure set_weight(Value:integer);
23
24 public
25 constructor Create(Name:string;Sex:string;Year:integer;Tall:integer;Weight:integer);overload;
26 constructor Create(Name:string;Sex:string);overload; //重载构造函数,注意一定要使用关键字:overload
27 property _name:string read get_name write set_name; //为类定义属性,以便在外部可以访问
28 property _sex:string read get_sex write set_sex; //其中read表示可读,后面紧跟一个返回该属性值的函数名
29 property _year:integer read get_year write set_year; //write 表示可写,后面紧跟一个设置该属性值的函数名
30 property _tall:integer read get_tall write set_tall;
31 property _weight:integer read get_weight write set_weight;
32
33 end;
34
35 implementation
36 //构造函数的实现
37 constructor Person.Create(Name:string;Sex:string;Year:integer;Tall:integer;Weight:integer);
38 begin
39 Self.name:=Name ; Self.sex:=Sex ; Self.year:=Year ; Self.tall:=Tall; Self.weight:=Weight ;
40
41 end;
42 constructor Person.Create(Name:string;Sex:string);
43 begin
44 Self.name:=Name ; Self.sex:=Sex ; Self.year:=0 ; Self.tall:=0; Self.weight:=0;
45 end;
46
47 //类属性的内部实现 请与c#作比较:get{},set{}
48 function Person.get_name:string;
49 begin
50 result:=Self.name ;
51 end;
52 procedure Person.set_name(Value:string);
53 begin
54 if (Value<>'') then
55 name :=Value ;
56 end;
57 function Person.get_sex :string;
58 begin
59 result:=Self.sex;
60 end;
61 procedure Person.set_sex(Value:string);
62 begin
63 if((Value<>'female') and (Value<>'male')) then
64 Self.sex :='male'
65 else
66 Self.sex :=Value;
67
68 end;
69 function Person.get_year :integer;
70 begin
71 result:=Self.year ;
72 end;
73 procedure Person.set_year(Value:integer);
74 begin
75 if(Value>200) then
76 Self.year :=0
77 else
78 Self.year :=Value ;
79 end;
80 function Person.get_tall :integer;
81 begin
82 result:=Self.tall ;
83 end;
84 procedure Person.set_tall (Value:integer);
85 begin
86 if(Value>300) then
87 Self.tall:=0
88 else
89 Self.tall:=Value ;
90 end;
91
92 function Person.get_weight :integer;
93 begin
94 result:=Self.weight ;
95 end;
96 procedure Person.set_weight(Value:integer);
97 begin
98 if(Value>1000) then
99 Self.weight:=0
100 else
101 Self.weight:=Value ;
102 end;
103
104 end.
其次一个学生类继承了上面的人类,定义如下:
2
3 interface
4 uses Person_Cls;
5 type
6 Student=Class(Person)
7 private
8 stCode:string; //学号
9 department:string; //学院 (大学),学校名称(其他)
10 classGrade:string; //班级
11 function get_stCode:string;
12 function get_department:string;
13 function get_classGrade:string;
14
15 public
16 //构造函数定义
17 constructor Create(s_name:string;s_sex:string;st_code:string;st_dt:string;st_clg:string);
18 property _stCode:string read get_stCode; //定义只读属性
19 property _department:string read get_department;
20 property _classGrade:string read get_classGrade;
21
22 end;
23
24 implementation
25 constructor Student.Create(s_name:string;s_sex:string;st_code:string;st_dt:string;st_clg:string);
26 begin
27 inherited Create(s_name,s_sex); //注意在此使用inherited关键字调用基类的构造函数,并向基类person传递
28 //参数。在c#中可以使用base指定参数列表,在delphi中要使用inherited显示说明
29 Self.stCode :=st_code; Self.department:=st_dt ; Self.classGrade:=st_clg ;
30
31 end;
32 //只读属性的内部实现
33 function Student.get_stCode :string ;
34 begin
35 result:=Self.stCode ;
36 end;
37 function Student.get_department :string ;
38 begin
39 result:=Self.classGrade ;
40 end;
41 function Student.get_classGrade :string;
42 begin
43 result:=Self.classGrade ;
44 end;
45 end.
以上就是这两个简单的类定义,很好的说明了delphi中类和派生类的关系。
需要补充的一点就是,delphi中当你为类提供了自定义的构造函数后,系统还是会为你提供默认的构造函数。这一点需要注意。
至于类的使用,和一般面向对象的语言是一样的,用构造函数创建对象,在必要是卸构他就行了。
转载于:https://www.cnblogs.com/Hi-ILoveFeng/archive/2006/06/15/426180.html
Delphi的类与继承相关推荐
- C++:随笔5---this指针和类的继承
this指针:(通过一个典型的例子来认识他) class Human {char fishc;Human(char fishc);//构造函数}; Human::Human(char fishc)// ...
- 【廖雪峰python进阶笔记】类的继承
1. 继承 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: class Person(object):def __init__(self, ...
- LotusScript类的继承
最近在修改产品时,时常遇到需要修改一个自定义类的方法,但是这个类又不能给整个(代码保密),这时如何调试就变得很麻烦了.下面通过类的继承就可以很方便的解决这个问题了. Option PublicClas ...
- java类接口实验_实验3_Java类的继承和接口的定义和使用
本次有三题:学会Java类的继承.接口的定义和使用 // Ex3_1.java /** * 题目要求: * 修改例5.7(P95)实现在页面中拖动鼠标画出矩形,矩形的对角线为点击并拖动鼠标形成的直线线 ...
- python 类的继承,类中的函数调用以及类输入数组
第一部分,类的继承 先给出一个例子: class People(): #定义类,要大写,python 2中要在括号里加如object这个单词def __init__(self,n,a,w): #定义一 ...
- python 笔记 之 类的继承与重写
2019独角兽企业重金招聘Python工程师标准>>> ''' 6.继承 super 重写 调用:先找子类中的方法,如果子类中找不到就到父类中找 多继承:如果父类中都有该方法,那么先 ...
- python中的继承有什么特点_python类的继承是什么?类的继承有什么样的规则?
在这篇文章之中我们来了解一下python类的继承,对于刚刚接触到python这一编程语言的朋友来说,对于python类的继承的了解应该比较少,不过没关系,在接下来的文章之中我们就来了解一下python ...
- C++知识点44——类的继承概述
类的继承,是新类从已有类那里得到已有的特性,或从已有类产生新类的过程.原有类称为基类或父类,新类称为派生类或子类. 子类通过类派生列表确定子类继承了哪些类.类派生列表的形式如下 class 子类名:访 ...
- python3 入门 (四) 类与继承
Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...
最新文章
- Kaggle竞赛中使用YoloV5将物体检测的性能翻倍的心路历程
- Python json使用实例:字符串与对象互转代码示例
- 获取某一日期为当年的第几旬
- DotText使用非80端口(默认端口)时URL出错
- 项目管理中网络图的看法和相关参数阅读说明
- 深入理解Redis分布式锁
- ASV2011新功能逐个数
- C++学习笔记————WINAPI宏定义
- 关于APKsmail中加入代码报错All register args must fit in 4 bits
- 人脸识别5.2- insightface人脸3d关键点检测,人脸68个特征点、106个特征点;人脸姿态角Pitch、Yaw、Roll、
- 解决 用VirtualBox安装Windows95后启动乱码
- 亚马逊跨境商家会用的邮件管理软件—解孵
- 反向代理为何叫反向代理?(含案例)
- java 小程序 自己学习
- Word学习简单笔记(2)文档排版与设计
- 智能编程和乐高机器人的区别
- Picasso之图片缓存机制二ListView篇
- mac备忘录html,在 Mac 上撰写和格式化备忘录-添加提醒-添加日历
- Intel用户注意:AMD SAM技术帮你提速最多18%
- 根据属地id选择子属地