Board logo

Subject: Delphi面向对象学习随笔一:类与对象的关系 [Print This Page]

Author: bahamut8348    Time: 2008-6-20 13:16     Subject: Delphi面向对象学习随笔一:类与对象的关系

工作几年了,总想做点总结,于是有了这篇东西,叫随笔吧呵
    本文只是写写我对对象化的理解,主观成分很多,或许有错误,希望大家指正^_^
    PS: 本文的演示代码均以Pascal语法为准。
类与对象的关系
    要讨论类与对象的关系,需要先说一下什么是类,什么是对象。

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

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

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

[Copy to clipboard]
CODE:
var
  i: Integer;      //定义一个整形变量i
  s: TStringList; //定义一个TStringList类的对象s
begin
  i:= 0;
  { 这是对的,因为当定义了一个int类型(简单类型)的变量后,
    编译器会自动为你这个变量分配内存空间 }
  s.LoadFromFile(...);
{ 错误,因为定义这个对象前,还没有为他创建内存空间,
    直接这样执行会引起一个内存错误 }
end;

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

[Copy to clipboard]
CODE:
  s:= TStringList.Create;

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

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

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

[ 本帖最后由 bahamut8348 于 2008-6-20 14:06 编辑 ]
Author: Yock.W    Time: 2008-6-20 13:45

  友情支持一下下
Author: Passion    Time: 2008-6-20 14:58

Yock别光支持,自己的第二篇呢?
Author: Yock.W    Time: 2008-6-20 23:44

   没巴哈这么有时间啊
Author: shenloqi    Time: 2008-6-23 11:41

看巴哈辛苦的码了这么多字,我也针对巴哈文章说两句:)

类和对象这种面向对象的形式,尤其是静态类型的类和对象这种形式,我理解一方面是为了方便理解和抽象,另一方面也是因为历史原因的限制,也是对速度和性能的一种妥协,这个暂且不说。我回复的东西所限的内容也跟巴哈一样只限于Delphi的面向对象观,而且也一样不从教科书的角度说事。

关于类的理解,我觉得说类是一个集合有些不妥,我觉得类是具备某些共同属性的东西的定义描述,而定义类和类层次就跟发明一种对物体的分类方法一样。类和其他自定义类型(如记录/结构以及旧的object类型等)的差别我觉得主要是类可以封装和继承。至于行为,因为其他一些语言以及后来版本的Delphi也支持给记录/结构添加行为,所以我觉得这应该不算是主要的区别,而且,我认为正是面向行为的思考才会使面向接口编程大行其道。

码字挺辛苦的,下面简短说:

Delphi中定义的类在编译之后就会存在(编译器了解源代码中定义的类),所以巴哈例子中的s := TStringList.Create;这句的意思就是从编译器已经安排好的TStringList类创建一个TStringList的实例并赋值给s变量。而s.Create这样的方法在s没有被创建的时候调用其行为是未知的。

一般情况下类的属性可以说是一种状态,也可以说是一种描述符。同样举颜色是红色的一个汽车而言,汽车是类,一个汽车是一个对象,而颜色是汽车这个类的属性(一个汽车这个对象是汽车这个类的实例,所以一个汽车也有颜色这个属性的,但是定义颜色这个属性是到汽车这个类上定义的),而红色是一个汽车这个对象的颜色属性的值。

一般情况下方法可以理解为行为。

而事件则可以理解为对象的一些行为发出的通知(在对象的定义——类上定义事件)。
Author: Passion    Time: 2008-6-23 11:46

集合在Delphi中已经有set的概念了,说类是集合容易混淆的。
Author: lixupeng    Time: 2008-7-1 21:27

写的不错有声有色顶!!!!!! 希望楼主能继续努力




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0