请教:关于面向对象编程(OOP)

JackLucifer 2002-04-01 07:54:16
根据OOP的理论,即使是应用程序本身也是一个OOP的对象。
是对象就有Method、Data,那么对于一个BCB应用程序而言,
它首先是一个Application对象,然后,其中包括Form1对象,
如果是用户自定义的函数就会加入到Form1对象中,
换言之,这个TForm对象的实例不仅从TForm对象中继承了原有的Method和Data,
而且还增加了一些属于它自己的、特有的Method或Data。

如果我自己定义了一个class,并且将它加入到Form1中,
那么,站在Application或Form1的立场上看,其功能都是可以内部完成的,也就是黑箱操作了。而如果站在自定义的class或其他Form1中所包含的控件的立场上,比如Form1中除了包含一个自定义的class,还包括一个Button1和Edit1,那么他们之间就是不同的class之间的关系了。它们之间如果要传递信息,比如,将Edit1->Text的内容作为数据放入到自定义的class中这样的操作,其操作数据的方法的调用都要受到protect、public等属性的限制。

这样的话,如果我写一个软件,首先想到的是它所要实现的功能,并据此写出伪代码或class的雏形,然后将class的接口函数和必要的GUI界面的接口函数连接。

如此软件就完成了?

不知道,我这样的说法对吗?

还有,如果是SDK的程序要如何实现OOP呢?
是否也和在DOS的OOP相似呢?当然这肯定是加上了对于窗口、消息的创建、显示和管理。


2002-04-01
Jack Lucifer

BTW:虽然今天是愚人节,但是我不会在这儿愚人。愚人者愚己嘛。
...全文
119 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
JackLucifer 2002-04-19
  • 打赏
  • 举报
回复
我是这样认为的:
将应用程序Application看成一个对象,它包含Form1和Form2两各子对象,
Form都是Application对象的成员,而两个Form之间则是独立的对象啊。
Form1并没有直接修改Form2,只是调用它提供的接口函数而已。
这就象Form中包含AnsiString对象一样呀。
我们可以将一个窗体看成对象,也可以将一个功能看成对象,这就看你如何
决定了,不是吗?

你当然可以在Form1中new来产生一个Form2,但这时Form2只是Form1中所
包含的一个对象,而我只是将Form1和Form2当作两个对象来处理罢了。
lyghe 2002-04-19
  • 打赏
  • 举报
回复
当然不是OOP,Form2不是Form1的,凭什么让Form1来改变自己的东西?
除非,在Form1的私有变量中定义一个窗口TForm2 *Form2,然后在Form1的函数中生成这个Form2,这样Form1才有理由来改变这个Form2。
JackLucifer 2002-04-19
  • 打赏
  • 举报
回复
To: kkm1982(柯乐)
我觉得未必呀。这大概要看实现的功能来定的吧。
你举了个MoveTo函数为例子,我是不太清楚到底怎么回事啦,但是从函数名上
我推测你希望可以在Form1中来控制Form2在屏幕上的显示位置吧。
假定我是对的话,我想可以这样做。

将Form1和Form2看作是两个对象。
Form2拥有Top、Left等控制自己窗体显示位置的私有属性,既然如此,那么
我就在Form2的头文件(假定为Unit2.h)的public域中建立以下函数:
void MoveTo( int Left, int Top, int Width, int Height);
然后,在Form2的代码文件(假定为Unit2.cpp)中写入以下实现代码:
void MoveTo( int Left, int Top, int Width, int Height)
{
Form2->Left = Left;
Form2->Top = Top;
Form2->Width = Width;
Form2->Height = Height;
}

然后就可以在Form1中调用这个方法了,大概这样的函数就叫接口函数了吧。
不过,刚才我在BCB5试了一下,添加了两个Form,Form1包含Form2,在Form1
中好像可以直接调用Form2的Left、Top等属性,只是不知道是否是只读的。
唉,不知道这样算不算是OOP,我是说,是不是符合OOP的思想?
OOP真的好难,我现在才知道。

为什么没高手指点呢?
就我这菜鸟在这里瞎掰,成天担心有那位高手进来扁我一顿,说我践踏OOP。
:-)

2002-04-19
Jack Lucifer

ps:问题到这儿,看来也没有高手愿意指教啦,等我装好宽带后就结贴,最多以后
再开贴。:-)
kkm1982 2002-04-18
  • 打赏
  • 举报
回复
呵呵,各位研究好深啊。恩,我以前有一个念头:派生一个带某种属性或方法的窗体,比如给Form2加一个MoveTo()的共有函数,然后在Form1里就可以用
Form2->MoveTo()来控制Form2了。不过这样似乎需要用到消息映射啊,是不是?
JackLucifer 2002-04-16
  • 打赏
  • 举报
回复
To:lyghe(TComponent* AOwner)
请不要那样说,您提出的问题一方面证明了不只是我一个人碰到类似的问题,同时也让我得到了一些启发。有时候,一个人从一个固定的角度考虑问题多了,思维就收到限制了。
我想大概这就是BBS等intenet服务最大的好处之一吧。

就想您说的那样,现实和理想之间总是存在着差距,但这差距不正是我们力求弥补的部分吗?
我现在还只是一个爱好者,用业余时间来做这些,或许正因为如此,所以我更注重自己是否可以达到某种水平、对某种开发技术是否掌握。
我想,如果有朝一日,我也进入编程的行当,或许就会遇上和您一样感到尴尬的情况了。
非常同意您说的:程序员的悲哀啊。

To:All
请精通OOP的朋友看一下我在 2002-04-08 22:18:00 发的示例代码,看看这样的代码是否符合OOP的要求,或者说是否符合OOP的思想?
谢谢。

2002-04-16
Jack Lucifer
lyghe 2002-04-15
  • 打赏
  • 举报
回复
C++ Builder的Bug太多,听我的一个高手同学说VC不错,很能体现面向对象的思想。
lyghe 2002-04-15
  • 打赏
  • 举报
回复
是啊,你说得很有道理。舍本求末不是我辈的宗旨。
但有一些事情是很无奈的。一个人在没有达到大师级水平以前,做工程的时候想要写出优美的代码几乎不可能的,因为工程少量的时间限制和大量的功能需求在压迫着自己。而且中国软件的现状是,工程的寿命都很短,一般几年就被淘汰了,所以一般企业只注重短期的实现,不注重长期的维护,根本没有人来管你代码的质量怎么样。一个coder(而不是programer),若想快速的开发出功能很多的模块,我想最重要的还是对工具的熟练程度。这是我毕业以后收到的第一个冲击,也是我作为一个程序员的最大悲哀。
这也是我打算过几年考研的原因。

对不起,我总是在这里发牢骚,没有多少实际的探讨。请见谅。
JackLucifer 2002-04-15
  • 打赏
  • 举报
回复
To:lyghe(TComponent* AOwner)
我不是特别认同您的观点。
现在做程序员的非常辛苦,要学的东西有很多,新生的事物更多。
我觉得每一样都学会是不可能的。
因此学会编程的方法比什么都重要。
写程序,说穿了是设计一个解决问题的固定的方法。
而开发工具则是具体的实现。
如果只钻研开发工具而不提高自己解决问题的能力,
那么就和只买好的提琴,却不刻苦练习的人妄想成为提琴大师一样。
这么说有点过分,毕竟开发工具也是非常重要的,
也是我们要花大力气去学习、钻研和掌握的。
但我的意思就是:我更注重提高自身的发现问题、解决问题的能力。
因为我不想被某种开发工具限制住,也就是T型发展吧。

个人想法,
未必正确,
如有得罪,
请勿见怪。

谢谢参与。


2002-04-15
Jack Lucifer
lyghe 2002-04-15
  • 打赏
  • 举报
回复
to: kkm1982(柯乐)
不知道你使用过线程没有?我刚刚开始学习线程,不知道线程之间应该怎么通讯。我觉得两个独立窗口的关系有点儿像两个独立线程之间的关系,它们的通讯很让我困扰。
lyghe 2002-04-15
  • 打赏
  • 举报
回复
我也是一个面向对象的初学者,大家一起探讨。

我觉得面向对象主要是一种设计思想,而不是一种设计规则。它的作用在于使程序代码具有更强的安全性、直观性、可移植性、可重用性等等。
如果真正从理论上研究,用CB很难做到真正的面向对象,至少需要自己写很多代码。这不是它的初衷。
比如,若要Form1真正管理Form2,你必须把集成环境自动生成的Form2的对象去掉,改为在Form1的私有变量中定义,在From1的成员函数中创建和删除。
另外,CB中有很多非标准OOP的东西。比如,CB中的私有成员属性都可以和一个set函数和一个get函数绑定,当对这个成员属性使用"="时,会自动调用这两个函数。这样的实现机制是什么?我没有在OOP中看到。当然,这是一种很好的实现机制,可以增强代码的封装性。

我想,既然选择了CB作为自己的开发工具,最好把自己的编程风格也变成CB的风格,并把自己当作傻瓜机的使用者,最大限度的使用CB中的方便之门。
我的想法显然是脱离了OOP方法,不一定适合别人。
kkm1982 2002-04-11
  • 打赏
  • 举报
回复
你的意思是在new时将form1设为form2的owner?“Form2是归Form1管的”是这个意思吗?用共有的区域进行通信,那还有什么封装可言?不就是全局变量吗?
~~~不懂~~``
JackLucifer 2002-04-11
  • 打赏
  • 举报
回复
To:kkm1982(柯乐)
我想他的意思应该是这样的吧。
Form1是一个对象,Form2是一个对象,而且Form2是一个包含在Form1中的对象。就像Form1中包含Edit1、Button1那样。“要通知第二个开始干下一个任务”的话,那么就想调用Edit1->Text那样,来调用Form2中的各种方法,包括Form2中的对象。这大概就是对象的嵌套吧。
我想包含h文件必要的吧,否则就没有对象的声明了。就像Form1中包含了vcl那样吧。

To:lyghe(TComponent* AOwner)
不知道我这么理解、解释是否对?
请指正。

To:All
请精通OOP的朋友看一下我在 2002-04-08 22:18:00 发的示例代码,看看这样的代码是否符合OOP的要求,或者说是否符合OOP的思想?
谢谢。

2002-04-11
Jack Lucifer
lyghe 2002-04-09
  • 打赏
  • 举报
回复
//-----------
比如我有两个窗体,第一个完成了一个任务,要通知第二个开始干下一个任务,我现在只好在Form1里引用unit2.h,然后在Form1里写Form2->text1->text=“********”。这样不好吧?到底怎么做才好呢?给Form2 来SendMessage,然后有Form2来处理?真头疼。
//-----------
我都是这样做的。如果真的来个SendMessage,你必须知道它的句柄吧,不是一样要include?不如直接调用函数来得方便。从语义上来讲,Form2是归Form1管的,Form1就能直接访问Form2中的东西。如果Form1和Form2是两个独立的窗口,那么Form1就不能指示Form2去做什么事情,只能通过它们共有的一块区域来通信。
JackLucifer 2002-04-08
  • 打赏
  • 举报
回复
感谢大家给予的意见和帮助,非常的感谢,
从中学到不少好的思想,也发现一些以前没有注意到的东西。

To:kkm1982(柯乐)
没想到还有人和我有同样的问题呀。
看来大家在学习和使用BCB的过程还是有共同的发展曲线的。
对于你头疼的问题,我在综合以上各位高人的指点后,得出解决方法如下:


======= 源代码 =======

~~~~ book.h ~~~~
#ifndef bookh
#define bookh
class Book{
prublic:
AnsiString BookTitle;

public:
AnsiString ShowBookTitle(void){ return BookTitle; }
void EditBookTitle(const AnsiString s){ BookTitle=s; }
};
#endif
~~~~~~~~~~~~~

~~~~ Unit1.h ~~~~
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>

#include <book.h>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *edtEdit;
TEdit *edtShow
TButton *btnEditBookTitle;
TButton *btnShowBookTitle;
void __fastcall btnEditBookTitleClick(TObject *Sender);
void __fastcall btnShowBookTitleClick(TObject *Sender);
private: // User declarations
Book book;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
~~~~~~~~~~~~~

~~~~ Unit1.h ~~~~
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::btnEditBookTitleClick(TObject *Sender)
{
book.EditBookTitle(edtEdit->Text);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::btnShowBookTitleClick(TObject *Sender)
{
edtShow->Text=book.ShowBookTitle();
}
//---------------------------------------------------------------------------
~~~~~~~~~~~~~

======= 结 束 =======

以上代码在BCB5中编译通过。
只是不知道这样的解决方法是否正确妥当,是否符合OOP思想呢?
还请行家、高手指点。

2002-04-08
Jack Lucifer
kkm1982 2002-04-07
  • 打赏
  • 举报
回复
我也有类似的问题。比如我有两个窗体,第一个完成了一个任务,要通知第二个开始干下一个任务,我现在只好在Form1里引用unit2.h,然后在Form1里写
Form2->text1->text=“********”。这样不好吧?到底怎么做才好呢?给Form2 来SendMessage,然后有Form2来处理?真头疼。
IT-司马青衫 2002-04-06
  • 打赏
  • 举报
回复
┏━━━━━━━━━━━━━┓
┃※※※※★★★★★※※※※┃
┃※【终级掠食者—大白鲨】※┃
┃※※※※★★★★★※※※※┃
┗━━━━━━━━━━━━━┛
说也说不清楚,
给你一些电子书
电子书版万岁 万岁 万万岁 万万岁!!!

经典著作
C++:
《钱能c++程序设计》明白易懂,
《Essentilal C++》
《Inside The C++ Object Model》中文版《深度探索C++对象模型》
《掌握C++标准类》
《汤姆.斯旺C++编程秘诀》
《Design Patern》中文名:《设计模式》

WINDOWS:
Jeff的《windows核心编程》
《windows高级编程》
Chales的《windows程序设计》

请问以上的书哪里有电子版下载

//----------------------------------------------------------------------------
Effective C++ 和More Effective C++ AND Thinking in C++ ADN The C++ Programming Language
下载网址:http://cpp.chinaccd.net/ebook

钱能《c++程序设计教程》那本书的书后习题源码?
到清华网站下载,ftp://ftp.tup.tsinghua.edu.cn/C++/

《C++高级参考手册》哪里有电子版式
在这里下载:ftp://dl3.51soft.com:8384/c_c021.zip



Win32Api.chm:
主页:http://202.103.176.81/erun/sealife/ (主力站点)
域名:http://Sealife.yeah.net

《MFC深入浅出第二版1-5》
win95-a-developers-guide.pdf
Windows95系统VxD程式设计.pdf
Windows95系统程式设计大奥秘.pdf
http://jjhou.csdn.net
http://www.jjhou.com

《软件工程思想》.word  
新编Windows API参考大全.word
《汇编语言全接触》.chm
《高质量C++编程指南》.word
《代码大全》.pdf
《程序设计实践》.pdf
《more effective c++》.pdf 1-27
《winasm32编程指南》.chm
《Win32汇编超全资料》.chm
《PE文件格式详解》.chm
《CSDN 精采问答》.chm
http://wlbookwl.myrice.com

Turboc2
win98ddkinc
winsoftice-9x
masm32v6.exe
http://www.hyedu.com

《MFC深入浅出》
http://pcbook.godcon.net

ms html workshop
http://www8.pconline.com.cn

软件工程杂志《非程序员》
http://www.umlchina.com
以e-book方式发行免费电子杂志《非程序员》,








dycdyc123 2002-04-04
  • 打赏
  • 举报
回复
做这样的软件:强制加各种需求,但不许改动程序框架。
这样你就能体会到了。

lyghe 2002-04-04
  • 打赏
  • 举报
回复
做这样的软件:强制加各种需求,但不许改动程序框架。
这样你就能体会到了。
另外,和别人一起学习,你会学得更快。
halfdream 2002-04-03
  • 打赏
  • 举报
回复
"想知道该注意什么要靠自己多编程多练习,有了感性体会才有理性思考。"
这句话非常赞同,只是。。

"我觉得,大概只有在大项目或十分复杂的软件的开发上,才会用到这个吧"。
不赞同。同意wave_calmly(静波)


wave_calmly 2002-04-03
  • 打赏
  • 举报
回复
但是OOP也真的很烦。
我觉得,大概只有在大项目或十分复杂的软件的开发上,才会用到这个吧
==> 此说,我不赞同
大项目也是由多个小项目构成的,小处都非OOP,大处的OOP怎么体现?
我觉得读VCL源代码,就能很深刻的理解这一点,VCL出了RTL外,都OOP了。
(除非你说的小项目是RTL之类对性能要求很苛刻的)
加载更多回复(12)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧