delphi中实现面向对象编成一问(200分)

J

jinchi

Unregistered / Unconfirmed
GUEST, unregistred user!
这里也就是一个普遍的问题:如何去掉rad功能,直接采用面向对象编程方法实现
问题描述:
我想实现两个类的聚合关系。如:
--------------------------
|TMyClass:TObject |
|------------------------ / ----------------------------
|MySocket:TClientSocket |<>-------- |ClientSck:TClientSocket |
|------------------------- / ----------------------------
|各种方法 | |成员和方法 |
------------------------- -----------------------------
那么,也就是 ClientSck作为TMyClass的一个成员,这里我如何引用ClientSck的
OnError,OnRead,OnAccept,OnConnecting方法,好像只见到rad编程中直接双击产生
事件,而我需要在程序中直接引用vcl控件的各种方法,并实现功能扩展。
也就是vcl控件如何像一个普通的类一样,如同在java和C++中把现有的一个vcl控件
作为一个普通类实现类之间的聚合,合成等各种关系。
这里也就是一个普遍的问题:如何去掉rad功能,直接采用面向对象编程方法实现
各种模式和类之间的各种关联(关联/聚合/合成!),因为vcl控件的事件参数好像
是面向rad的,而不利于直接的编码实现.
顺便请各位谈谈如何在delphi中利用现有的资源,如vcl控件,实现纯粹的面向对象
编程,而不是rad编程。
 
因为rad的原因,倒是感觉delphi中实现面向对象编程不如java和C#,这里的关键是
vcl控件的引用。比如C#中,我把clientsocket类作一个类的成员引用非常方便,但delphi
中倒是感觉有些难以处理。请问各位在delphi中实现各种模式如何处理控件rad功能限制面
向对象的问题?
另外,感觉对于设计模式/或者说面向对象编程的实现,不如完全手工实现,倒是不想用
modulemaker了。对此各位有何看法?
 
RAD只是便于快速开发,
事件属性只是一个指针,
你可以在你的类里,定义事件处理过程,
并赋值给事件属性,
那么发生此事件时,自然就会调用你的类的成员了
你可以看一下VCL类库中TControl怎么将TFont集成到内部,
并能处理TFont的OnChange事件
 
delphi中关于组件编程。
 
Delphi中的事件处理和C#中的事件处理
是有点相似的,
Delphi中可以用同样的方法来做
下面是VCL的一段源码,实现Font的集成
FontChanged是TControl的成员

{ TControl }
constructor TControl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FWindowProc := WndProc;
FControlStyle := [csCaptureMouse, csClickEvents, csSetCaption, csDoubleClicks];
FFont := TFont.Create;
FFont.OnChange := FontChanged;
 
to lichaohui:
这的确是一个实现的路子,但感觉什么都用事件/消息来传递,那么结构太松散了巴?
也并不是面向对象的实现方法阿?怎么感觉绕了一个湾?
 
to lp414:
呵呵,这么做岂不是更加更加麻烦?若扩展比较多的话,那么就是一堆的组件,
程序结构更加乱,所以并不是根本的解决之道。
相比之下,用事件和消息来通讯倒是一个解决方法,但也不大符合面向对象的原则。
 
只有事件,这种问题才变得如此简单,
如果你用过VC的话,你就会知道在VC中实现类的组装是多么困难的一件事啊,
只有松散的结合才能提高面向对象的重用性,
如果想实现紧密耦合,可以参照一下
TMemo和TMemoStrings之间的紧密耦合,但是这样就不能重用了
如果想实现这种类型,你可以从TClientSocket 再派生一个类
 
在面向对象中,界面实现和功能实现应该完全隔离。而rad中,不可视控件则必须放到
form等容器中,这就和面向对象编程原则完全冲突了。那么是否说不可视控件完全动态
动态生成更加好?因为对于一个大型的项目,可能用到很多不可视控件,甚至同一种
vcl都要用到很多,比如数据库控件,而同一种控件处理方法大体相同,那么如何处理
这种矛盾?是否生成一个接口,定义这种功能,然后把继承自控件的类继承这个接口?
还是定义一种类似于容器类来处理?
 
你对Delphi中的面向对象理解得太肤浅了,
不可视组件也并非只能放在Form中,
你可以在任何类的内部创建类的实例,
他也可以放在DataModule中,DataModule实际上就是一个类,
放在其中的组件被他集成,
同一种控件,你可以直接调用,它本身提供了调用接口(方法和属性)
为什么还要再生成一个借口?
Delphi这种语言(从D7开始Object Pascal语言正式命名为Delphi)
完全符合面向对象的思想,是你的理解过于肤浅了
实际上,你在用Delphi写程序的时候,都在不知不觉地使用Delphi的面向对象的特性
窗口类,数据模块,线程对象,还有其他很多的东西,
也正是Delphi中的面向对象,才能够实现RAD的特性,
也可以说RAD是构建在面向对象的基础之上的
 
to lichaohui:
呵呵,受教得说,因为对于参考书中这些东西很少有涉及得,大多是讲rad应用而已。
现在看java和一些模式应用,才想好好深究这些问题。的确非常喜欢delphi得说,希望
好好研究它,所以寄希望于李维即将出得<inside vcl>,来深入得了解vcl体系和面向
对象编程概念。目前也在自己探索,所以有着不少疑问。
那么还有一个问题:若不可视组件创建在自己得类中,而不可视组件得不少方法是通过
事件或者消息来响应得,比如socket控件,那么我需要其Onread事件中收到得数据,那么
是不是需要创建一个socket得继承类,然后在其Onread事件中产生一个我得类能响应得事件。
来通知我得类,收到数据了。是不是这是一种普遍得做法?
 
Delphi中的事件就是为了不用继承也可以相应类内部的一些情况,
是对外的一种接口,
是被事件源调用的“回调函数”,
你自己可以随便定义一个和事件类型一致的过程或函数
OnChange := MyProc;就可以让那个对象在适当的时候调用自己的代码
请看一下TNotifyEvent这个类型的定义
看一看TControl的部分源码,你就知道该怎么做了
Delphi中的事件处理和C#中的事件处理
是有点相似的,
Delphi中可以用同样的方法来做
下面是VCL的一段源码,实现Font的集成
FontChanged是TControl的成员

{ TControl }
constructor TControl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FWindowProc := WndProc;
FControlStyle := [csCaptureMouse, csClickEvents, csSetCaption, csDoubleClicks];
FFont := TFont.Create;
FFont.OnChange := FontChanged;
 
^_^,,,思维方式不同。
我认为未来的发展应该是在任一软件上面安装组件就可以拓展某个功能。
你的思维方式在于c#,java,但我认为你没有看清,或者说真正理解。
通过预留接口方式,将组件安装上去。程序架构非常清晰。安装上去的组件一般都是独立的,
不会影响该程序正常使用。
我记得老师在给我们上课时说过重复开发一直存在,但是当时没有一个很好的办法。
现在我想组件应该是个不错的方法。这样就能减少重复开发周期。
至今我还记得以前学C时开发,从头都是手动开发。因为当时很少利用现有资源。或者说难于使用。
给你个网站,你看看把。中间件技术。www.huihoo.com
关于消息和事件的组织结构,请看linux,windows系统书。
类:相似数据的集合。
对象除了类之外,应该有独特的属性,公有属性,动作形成了事件。
系统通过事件,消息将不同对象组织起来,形成一个完整的架构。

关于delphi面向对象编程我想很多书籍都说了,没有重复必要。
 
这里再提一个问题:具yysun(大富翁论坛得创始人)说d6才把interface支持完全,从而
能完全得支持设计模式;请问d6得interface与以前有什么变化么?为什么这么说?的确
若说起程序构架,可能interface是应用最为广泛得了,不是说与抽象类那个好,而是说
构架得灵活性更好,当然也需要看应用场合得问题。但无可否认,这个是实现很多模式
得基石。
yysun说:
: 所以现在用 Delphi 6 做 COM/DCOM 用 Interface, SOAP 也用 Interface, CORBA 
: 也用Interface. 已经远不局限于 COM 了 [:)] 

但,这里delphi用interface配合类得继承实现构件得可插入性(也就是多重继承
),是否和java得interface没什么大得差别了?也就是不是作为那些
com、soap、corbra特殊功能,而是作为类实现多重继承完全没有问题是吧?d6以前
都不支持interface接口实现多重继承这个问题么?好像可以得亚?(偶看得是objectpasical
语言参考,说可以的,但手头没有d5,比较好奇,嘿嘿)

 
顶部