既然已经做出了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下的类实现:

首先是一个表示人的基类,定义如下:

  1. unit Person_Cls;
  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:= ; Self.tall:=; Self.weight:=;
  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>) then
  76. Self.year :=
  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>) then
  87. Self.tall:=
  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>) then
  99. Self.weight:=
  100. else
  101. Self.weight:=Value ;
  102. end;
  103.  
  104. end.

其次一个学生类继承了上面的人类,定义如下:

  1. unit Student_Cls;
  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中当你为类提供了自定义的构造函数后,系统还是会为你提供默认的构造函数。这一点需要注意。
至于类的使用,和一般面向对象的语言是一样的,用构造函数创建对象,在必要是卸构他就行了。

Delphi的类与继承的更多相关文章

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

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

  2. QMetaObject感觉跟Delphi的类之类有一拼,好好学一下

    提供了一堆原来C++没有的功能,比如反射什么的...但是可能还是没有Delphi的类之类更强,因为类之类可以“创建类”.可惜我学艺不精,对“类之类”也没有完全学会.先留个爪,有空把两个东西都好好学学, ...

  3. DELPHI学习---类和对象(五篇)

    Classes and objects(类和对象) 类(或者类类型)定义了一个结构,它包括字段(也称为域).方法和属性:类的实例叫做对象:类的字段.方法和属性被称为它的部件(components)或成 ...

  4. Delphi 遍历类中的属性

    http://blog.csdn.net/easyboot/article/details/8004954 Delphi 遍历类中的属性 标签: delphistringbuttonclassform ...

  5. UML类图(上):类、继承和实现

    面向对象设计 对于一个程序员来说,在工作的开始阶段通常都是别人把东西设计好,你来做.伴随着个人的成长,这个过程将慢慢变成自己设计一部分功能来实现,自己实现.如果要自己设计,无论是给自己看,还是给别人看 ...

  6. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  7. (转)Java:类与继承

    原文地址: http://www.cnblogs.com/dolphin0520/p/3803432.html 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大 ...

  8. iBatis.net 类的继承extends和懒加载

    <resultMaps> <resultMap id="FullResultMap" class="t_c_team_member_permission ...

  9. python 类定义 继承

    0 前言 系统:win7 64bit IDE : python(x,y) 2.7.6.1 IDE集成的解释器:Python 2.7.6 (default, Nov 10 2013, 19:24:18) ...

随机推荐

  1. 脚本_查看当前系统每个IP的连接数

    #!bin/bash#作者:liusingbon#功能:查看当前系统每个IP的连接数netstat -n | awk '/^tcp/ {print $5}'| awk -F: '{print $1}' ...

  2. DCGAN生成式对抗网络--keras实现

    本文针对cifar10 图集进行了DCGAN的复现. 其中库中的SpectralNormalizationKeras需添加至python环境中 该篇代码如下: from keras import ba ...

  3. Big Data(六)用户权限实操&HDFS-API实操

    创建用户实操 1.创建用户god useradd god passwd god 2.设置ssh免密 ssh-copy-id -i id_dsa node02 3.修改hdfs-site.xml中的ss ...

  4. 关于form表单回车自动刷新

    现象: form表单,输入框聚焦后,回车,页面刷新跳转. 原因: form表单,在只有一个输入框的时候,在点击回车时,就会触发表单的提交,而form若没有url,则提交后就会刷新页面,导致跳转. 解决 ...

  5. Django学习系列6:使用selenium测试用户交互

    学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...

  6. Ubuntu安装DroidCamX网络摄像头

    1.安装依赖项 sudo apt-get install gcc make linux-headers-`uname -r` 2.安装 cd /tmp/ bits=`getconf LONG_BIT` ...

  7. asp.net mvc + vue.js + axios.js

    1.新建一个 MVC 应用程序 2.右键解决方案 添加VUE 3.搜索vue 1.安装axios.js ,用于数据请求,get , post axios

  8. 在CentOS 6.4上安装Puppet配置管理工具

    在CentOS 6.4上安装Puppet配置管理工具 linux, puppetAdd comments 五052013 上篇说了下在ubuntu12.04上安装puppet,安装的版本为puppet ...

  9. shell练习--PAT题目1007:关于素数对(失败案例)

    让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数.显然有d​1​​=1,且对于n>1有d​n​​是偶数.“素数对猜想”认为“存在无穷多对相邻且差为2的素 ...

  10. ubuntu中查看AMD GPU 状态的办法

    lshw -c video 运行命令:glxinfo | grep rendering 如果结果是“yes”,证明显卡驱动已经成功安装. 如果提示有问题,可能是系统里面没有安装mesa-utils,安 ...