Delphi面向对象学习(-)

Delphi面向对象学习随笔一:类与对象的关系
作者:巴哈姆特
http://www.cnpack.org
(转载请注明出处并保持完整)
工作几年了,总想做点总结,于是有了这篇东西,叫随笔吧呵
    本文只是写写我对对象化的理解,主观成分很多,或许有错误,希望大家指正^_^
    PS: 本文的演示代码均以Delphi 的Object Pascal语法为准。

类与对象的关系
    要讨论类与对象的关系,需要先说一下什么是类,什么是对象。


    类、我认为是一个集合,和数学中的集合一样,是一类事物的统称,例如“人类”。
    在计算机语言中,类和数组或结构等数据类型一样是用户(程序员)自定义的数据类型,但是我们常说,类是复杂的自定义类型,而其他的数据类型则称为简单的自定义类型。原因是因为类是有行为的!
    另外、类是抽象存在的,就拿“人类”来说,我们都知道,在这个世界上是存在人类的,但是谁能说清楚“人类”长什么样?有多重?

对象
    对象则是类中的一个个体,例如我或者是正在看这篇文章的你,都是“人类”中的一个个体。
    计算机语言中,你是无法让一个类直接为你工作的(有些带类方法的特殊情况除外),就像世界上没有任何一个人有能力让整个“人类”为你工作一样;那么要让你的类为你工作,我们就需要这个类的一个对象,当我们有了一个对象以后,那么我们才能让他为我们做我们想要做的事。

实例化对象:
    我们都知道,在当前的计算机操作系统中,任何软件运行都需要一个内存块,也就是生存空间。同样,对象也要,就像我们生下来就要占地方一样。在你要让一个类的对象为你工作之前,你需要为他分配一个内存空间并创建它,这也是和其他的数据类型不一样的地方:

var

  i: Integer;      //定义一个整形变量i

  s: TStringList; //定义一个TStringList类的对象s

begin

  i:= 0;

  { 这是对的,因为当定义了一个int类型(简单类型)的变量后,

    编译器会自动为你这个变量分配内存空间 }

  s.LoadFromFile(...);

  { 错误,因为定义这个对象前,还没有为他创建内存空间,

    直接这样执行会引起一个内存错误 }

end;

正确的方法应该是,在使用类的对象前,要显示的调用类的构造方法:

CODE:

  s:= TStringList.Create;

或许有朋友会说,为什么不是s.Create呢?那是因为,在执行这条代码前,还没有为s分配内存空间,是不能访问他内部的数据成员的,而前面说了,“类是抽象存在的”,所以在编译器为你的代码打包成可执行文件后,TStringList在内存中已经存在了。当然这种“类名.方法名”的调用方式只能用在类(静态)方法上,而类的构造器的入口则是必须静态存在的。

属性、方法、事件
    属性是类的特性:例如红色的汽车,红色就是这辆汽车的颜色属性
    方法则是我们传统意义上的函数或过程,也就是类可以做的事:例如汽车可以向前开,也可以向后开
    事件则是在特定条件下,被动调用的代码段,也就是说,事件中我们指定填写的代码可能我们没有手动调用,但是它却可能在一个特定的条件下被对象内部调用而得到执行(当然不排除你显示的手动调用)。

暂时先说到这里,套用一句评书中的话:“预知后事如何,且听下回分解”^_^

时间: 2024-11-10 01:36:20

Delphi面向对象学习(-)的相关文章

Delphi面向对象学习随笔九:后记

作者:巴哈姆特http://www.cnpack.org(转载时请注明出处并保持完整) 最后一篇了,呵呵!其实通过写这几篇笔记,也发现了我自己知识欠缺的部分.当然也通过各位高手的提点,让我把以前学习过的东西来了一次“体检”.    当然,错误也有,但是改了就还是好同志嘛,呵呵^_^ 随便介绍一下Delphi中的几个比较常用的类吧: TObject:    VCL中所有类的根类,即是说:VCL中所有的类/组件/控件都是从TObject中继承而来.TObject类中定义了基本的构造方法和析构方法.

Delphi面向对象学习随笔三:overload与override

作者:巴哈姆特(转载请注明出处并保持完整)    首先,我想单独说明一下overload,为什么呢?因为overload和对象化关联不大,所以,我感觉单独提出来说明比较好.    我们都知道,在Pascal语法规则中,同一个UNIT里是不能存在两个同名的函数的,例如: function func(): Boolean; function func(const x: Char): Boolean; 这样是会出语法错误的,原因是因为标识符规则限制.但是问题出来了,如果我们需要几个功能相似但是参数不同

Delphi面向对象学习随笔八:物理封装

作者:巴哈姆特http://www.cnpack.org(转载请注明出去并保持完整)前面说过的封装其实是逻辑意义上的封装.逻辑封装是对某一特定逻辑功能模块的封装,这个特定逻辑功能块可以是一个类,当然也可以是一个包,他们都有自己的逻辑边界.另一种封装方式,我们通常叫它为物理封装:物理封装其实是具体实现代码的物理集合,他可以以bpl,dll,com+等形式体现. 逻辑封装里,对象的传递.数据共享与调用相对要简单的多,只要我们引用类所定义的单元(unit)就可以直接访问类中public和publish

Delphi面向对象学习随笔七:COM

作者:巴哈姆特http://www.cnpack.org(转载请注明出处并保持完整) 上一篇,我们介绍了接口.如果没有接触过COM对象的话,你会觉得接口真的很麻烦,也许会有:“还不如直接定义一个类更方便”的想法.    的确,没有经过COM封装的接口确实比较麻烦.在我看来,没有经过COM封装的接口似乎没有存在的意义.那么,什么是COM对象呢?它有什么优点呢?接下来开始对COM对象进行一个简单的介绍: COM是个二进制规范,它与实现的语言无关.这样,即使COM对象由不同的编程语言创建,运行在不同的

Delphi面向对象学习随笔二 编写第一个类

作者:巴哈姆特(转载请注明出处并保持完整) 这回,我们讨论怎么编写我们自己的第一个类.    在编写我们自己的类之前,首先要说的是“类的继承”.    记得前几天,我在和一个朋友讨论类的特点的时候,他说:“类是可以没有构造方法的!”其实类必须有至少一个构造方法的,但是他的话也不全错,可以理解成“我们可以不实现我们自己的构造方法”.    当我们没有显式的为类编写一个构造方法的时候,那么,看上去,这个类好象是没有构造方法,但是实际上,就算你没有为这个类编写一个属于你自己的构造方法的时候,该类还是有

Delphi面向对象学习随笔五:一个真正的类

作者:巴哈姆特(转载请注明出去并保持完整)写在前面的话:    本篇笔记完全属于我的个人主观观点,如有错误请指正^_^  类的定义:    首先,我想说的是,类并不是一些变量和函数简单的“拼凑”出来的.类应该是对于一个事物的抽象描述,而不是一个动作的抽象描述.怎么讲呢?    比如说:鞋子是一个事物,我们可以把它的特点抽象出来,并用计算机语言去描述成为一个类,而鞋子又分了凉鞋.皮鞋等,那么“凉鞋”和“皮鞋”则是“鞋子”的派生类.它们看上去是非常自然的.    那么,现在我有另外一个类,“初始化数

面向对象学习笔记

abstract:抽象类或方法的关键字注意事项:一个类中至少有一个抽象方法不允许有大括号主要意义就是规范方法,要求必须按照抽象中的方法来写继承抽象类的类,必须重载完全抽象类的方法抽象类是不能被实例化的,因为本身没有意义 extends 继承的关键字 类中常用的关键字:final 被定义的类不能被继承,该类的方法不能被继承,相当于一个锁的功能self self::静态成员,相当于类名称::静态成员,和this是有区别的,$this访问类中的内容必须实例化,而self是直接可以访问类中的内容的,多用

php面向对象学习

php面向对象学习 近期跟着别人开发一套php程序,深感自己面向对象很白痴,于是再次巩固了一下面向对象的学习,自己整理了一下这几天面向对象的东西,给大家分享!! 面向对象的三大特性: 封装 -- 隐藏内部实现,稳定外部接口 继承 -- 子类继承父类成员,实现代码复用 多态 -- 不同子类对同一消息做出不同的反映 一.接口 -- 是一套规范,遵守这个规范就可以实现功能 在PHP中,接口同样是一种规范和标准,可以约束类的行为,定义一个接口不指定具体的实现. 接口是把隐式公共方法和属性组合起来,以封装

面向对象学习【类-匿名类】

匿名类是就就像这个词一样,是一个没有名字的类,看到这个匿名类有点迷糊了,如果大家想想一个类没有名称的话那么我们如何来使用他创建实例呢?答案就是我们可以使用 var 来声明一个匿名的类,创建的格式为: new anonymousClassName{字段1,字段2,........} 说明: 匿名类当中的字段都全部都是public类型的,这就意味着我们可以在外部随意有访问这个所谓的匿名类: 看着这么爽其实这个匿名类还有很多的限制如: 1.使用匿名类时,必须对其初始化: 2.只能包含public字段;