比如我的软件要实现如下功能:可以打开多种格式的文件并显示、处理。我现在的做法是:针对每一种格式的文件,写一个打开函数,写一个显示处理函数。由于不同格式的文件都是由文件头+数据段组成,而且某些处理显示方法差不多。确实在这些函数中存在重复的代码,但由于参数不同等因素,很难合并这些函数。
最近看了一些关于oop方面的书,按oop的思路,我是不是应该先定义一个对象(文件对象),然后定义多个类(每种格式的文件一个)和它们的属性等。然后呢?
我怎么看不出oop思想的先进性呢?比如:当需要多显示处理一种格式的文件时,我只需写2个处理函数就行了,这样很麻烦吗?
现在的参考书都以概念为主,不结合具体的例子,很难理解和体会,谁能针对我举的例子说说oop的好处和使用的具体办法?
最近看了一些关于oop方面的书,按oop的思路,我是不是应该先定义一个对象(文件对象),然后定义多个类(每种格式的文件一个)和它们的属性等。然后呢?
我怎么看不出oop思想的先进性呢?比如:当需要多显示处理一种格式的文件时,我只需写2个处理函数就行了,这样很麻烦吗?
现在的参考书都以概念为主,不结合具体的例子,很难理解和体会,谁能针对我举的例子说说oop的好处和使用的具体办法?
解决方案 »
- syneditor如何设置高亮语法
- ODAC查询结果不完整
- adotable连接oracle数据库,一个类型为NUMBER(18)字段显示为BCD OVERFLOW
- 一个资料管理程序的设想,新手,请给一个思路
- ADOQuery1:=TAdoQuery.Create(nil)和form1:=Tform1.Create(self)和form1:=tform1.create(application)中create()中的参数代表什么意思
- 如何在线程中通过seversocket(stNonBlocking方式)收发数据?(最好有例子)
- 高手,请你帮助解答一下这个问题,本人有高分相送!!
- 紧急求救:关于如何控制网络打印机的问题? 请大虾们关注
- 线程类中使用其他类的变量不能赋值
- 我进了一家公司做Delphi程序,两个月了,老板说刚进来的时候是试用期,每个月300块钱,可是今天他炒了我,还说我没有为公司做什么事情,不给我工资,这合不合理呀。在公司里我差不多天天加班
- 请教如何写一个基于文件的小型数据库?
- 全局变量的简单问题,请进来看看!急!!
建立一个文件基类,里边包括文件打开函数,在打开函数中调用另一个处理不同文件内容的函数,后者作为虚函数存在,然后为每个不同的文件格式派生新的类,在所派生的类中重写基类中定义的虚函数。
TMyFile = class
public
procedure Open(...);
procedure View(...);
protected
procedure OpenHelper(...); virtual;
procedure ViewHelper(...); virtual;
end;TMyDocFile = class(TMyFile)
protected
procedure OpenHelper(...); override;
procedure ViewHelper(...); override;
end;implementationprocedure TMyFile.Open(...);
begin
//进行所有文件格式相同的操作
//.......
OpenHelper(...);//OpenHelper函数进行不同文件格式的差异处理
//......
end;..........
封装起来,用到了就直接调用,如果这种方法的函数需要修改,就直接修改dll,class
大大提高了效率,这是代码封装重用的好处。更有用的是他的继承性,就如所示:这是一个父类,TMyFile = class
public
procedure Open(...);
procedure View(...);
protected
procedure OpenHelper(...); virtual;
procedure ViewHelper(...); virtual;
end;
这是一个继承基类方法函数的子类
TMyDocFile = class(TMyFile)
protected
procedure OpenHelper(...); override;
procedure ViewHelper(...); override;
end;
这个子类不仅有自己的方法,而且能用父类的方法。
不仅代码重用,而且实现了模块化编写。
在编码维护方面更有所长。
oo的体现了对特定事物模型化处理的思想。
是通过对一类物体的行为属性的集合处理在
计算机上实现的。
。
还有很多。。
等你有机会参与大型项目的开发,你就知道了
特别是用vc的体会更深,
如果你想成为一个真正的pm,那么用vc吧。
delphi 是开头容易后来难。
vc相反---我的体会
1、使用函数,你要写100个打开函数,100个显示函数,然后调用: case filetype(sType) of
ftType1 : opentype1(filename);
ftType2 : opentype2(filename);
...(省略98个)
end; 调用显示函数也是如此,考虑一下,如果你要实现更多的功能,比如搜索等等,每种功能调用的时候你都要有一个长达100多行的case调用。2、使用类: 参考 yrb() 的代码创建基类, 功能调用
case filetype(sType) of
ftType1: FileObj := TFileType1.Create;
ftType2: FileObj := TFileType2.Create;
...
end;
FileObj.Open(filename);
FileObj.View;
// 如果增加了新的功能,只要在此增加
FileObj.OtherFun;不说其他的,由此就可以看出oop的优势。
public
//这里可以进行一些通用的设置
procedure Write; virtual;
procedure View; virtual;
end;TDealFileChild1 = class(TDealFile)
public
procedure Write; override;
procedure View; override;
end;
TDealFileChild1.Write;
begin
inherited;
//这里进行此类型文件的设置
end;TDealFileChild1.View;
begin
inherited;
//这里进行此类型文件的设置
end;先说2个好处:
1.每增加一个文件类型,通用的设置部分代码就不用Copy过来了,修改了就所有的子类全部都改好了.然后每个子类又可以进行自己的设置.
2.所有的类都用同样的函数名来调用.不用记忆繁多的函数名.结合设计模式,可以再设计一个通用的类来管理这些类.
比如(简单点,用一个函数表示,实际情况当然会复杂得多):procedure CommonWrite(filetype:Integer);
begin
case filetype of
0:DealFileChild1.write;
1:DealFileChild2.write;
2:DealFileChild3.write;
.....
end;
end;这样管理起你的文件类型,是不是方便很多,只需要知道2个函数和文件的类型,就可以自动处理了.
回复人: mastersky(浪) ( ) 信誉:97
的解释比较清楚.
但我要用结构化模块化的设计的话:那我可以,1、将公用操作提炼为一函数(如同提炼出来的基本类中的公用方法)。2、将打开文件操作做一个功用打开函数使用case fileType of .... end;这样我打开的时候用这个函数传入文件名和类型即可。3、显示也如同打开一个再加个公用显示函数。
但是比较一下还是用面向对象技术好啊,最少我看到只要在创建的时候判断类型即可,打开,显示都不用判断了。
先定义一个类或者纪录TFileStruct用来表示文件的格式在TMyFile里里声明一个TFileStruct类型的变量CurrentFileStruct:TFileStruct;
每次改变文件格式时在TMyFile里调用他的initialFile初始化函数初始化CurrentFileStruct