星期五, 十一月 24, 2006

Delphi之面向对象程序开发

Delphi之面向对象程序开发
作者:熊建峰 网址:http://www.passtwo.com 邮箱:passtwo@gmail.com
  使用Delphi编程也有一段时间了,Delphi开发程序效率很高,但是一直感觉和VB开发程序没有什么两样,除了语法的区别之外就是在控件、窗体等基础上进行程序开发了,Delphi面向对象开发的特点没有一点体现出来。
  最近在开发一个应用程序的时候对系统代码进行查看,才恍然大悟,其实,基于Delphi的VCL组件下的开发实际上就已经遵循了面向对象的规则。举例说明如下:
例1:一个普通的Delphi窗体
我们利用Delphi进行程序开发的时候,首先就是一个窗体,设置好窗体的属性,好了,我们来看看窗体的代码。如下:
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;
首先看看这段代码,定义了一个类型TForm1,它集成自TForm类,同时有两个属性:Edit1和Button1。同时还有可以添加private和public的地方。从面向对象的角度来讲,这属于面向对象的一个典型应用(使用了集成来生成新的类型)。那么,有人会说,在delphi下本来就是这样,跟我的程序有什么关系?我又怎样才能把面向对象的方法应用到我的程序中来呢?下面我来举一个例子说明。
例2:一个简单的继承
  图1列出了一个大家比较熟悉的继承关系,图中包含三各类:水果,苹果,桔子。水果作为基类,它有两个属性:颜色和重量,另外水果都可以被食用,但是不同的水果有不同的方法,所以在水果类中有一个public abstract void 食用(),所有水果的子类必须实现该方法。苹果和桔子为水果的子类,它们集成了水果的基本特性:颜色和重量,另外它们分别实现了水果的食用()方法。它们的代码看起来如下:
unit Ufruit;

interface

uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
Forms, Dialogs;

type
TFruit = class(TObject)
private
mColor: Integer;
weight: Integer;
public
procedure eat; virtual; abstract;
end;

TApple = class(TFruit)
public
procedure eat;
end;

TOrange = class(TFruit)
public
procedure eat;
end;


implementation

{
************************************ TApple ************************************
}
procedure TApple.eat;
begin
end;

{
*********************************** TOrange ************************************
}
procedure TOrange.eat;
begin
end;


end.
  以上的代码是继承关系在Delphi下的编写,那么这些东西怎样才能和VCL组件结合起来,形成我们所熟悉的Form展现给用户呢?下面我们举例说明这个问题


图1
例三:使用Form实现水果的集成
有了我们水果的类图,我们使用Delphi的窗体来对水果集成关系做一个界面出来,首先是基类:TFruit,窗体界面如图2:

图2
它的代码如下:
unit UFruit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TfrmFruit = class(TForm)
mColor: TEdit;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure eat; virtual; abstract;
end;

var
frmFruit: TfrmFruit;

implementation

{$R *.dfm}

procedure TfrmFruit.Button1Click(Sender: TObject);
begin
eat;
end;

end.
接下来我们实现苹果类:选择File->New->Other->project1,如图3所示

图3
点击ok后,将出现苹果类的窗体(有没有感觉和水果类很像呀^_^),更改窗体的caption和name属性,然后实现fruit的eat方法,好了,我们的苹果类就做好了,如图4:

图4
它的代码如下:
unit UApple;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, UFruit, StdCtrls;

type
TfrmApple = class(TfrmFruit)
private
{ Private declarations }
public
{ Public declarations }
procedure eat;override;
end;

var
frmApple: TfrmApple;

implementation

{$R *.dfm}

{ TfrmApple }

procedure TfrmApple.eat;
begin
Application.MessageBox ('我是苹果,吃起来是甜的!','',32);
end;

end.
同样的方法,实现桔子类,程序界面如图:

图5
代码如下:
unit UOrange;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, UFruit, StdCtrls;

type
TfrmOrange = class(TfrmFruit)
private
{ Private declarations }
public
{ Public declarations }
procedure eat;override;
end;

var
frmOrange: TfrmOrange;

implementation

{$R *.dfm}

{ TfrmOrange }

procedure TfrmOrange.eat;
begin
Application.MessageBox('我是桔子,吃起来是酸的!','',32);
end;

end.
小结
以上我们使用Delphi的窗体实现了水果类、苹果类和桔子类,这样,就将实际的业务类和VCL组件类结合起来了。使用同样的方法,我们在进行数据库编程的时候可以首先考虑进行业务建模,然后画出类图,最后使用Delphi的窗体来完成整个程序的开发。我写这篇文章旨在抛砖引玉,欢迎大家一起讨论。

没有评论: