请教关于面向对象 ( 积分: 150 )

  • 主题发起人 主题发起人 norlon
  • 开始时间 开始时间
N

norlon

Unregistered / Unconfirmed
GUEST, unregistred user!
用delphi有一年多了,发现自己还没有一点面向对象编程的概念。现在在写一个软件,有点问题向大家请教一下。
这是一个远程监控的上位机软件,一个服务器同时连接很多站点。想定义一个类,用来描述这些站点,每个站点作为一个对象。不知道这种想法合不合理。
我现在想到的问题是站点也许有很多>100个,站点的属性也很多。也就是说每次运行程序时都要先创建这么多的对象,然后还要给没个对象的属性赋初值。这个是不是要占用很长的时间。
还有一个问题比较泛:对象是必需的吗?什么时候要用到对象?什么时候只需要结构就可以了?
请大家赐教,谢谢!
 
用delphi有一年多了,发现自己还没有一点面向对象编程的概念。现在在写一个软件,有点问题向大家请教一下。
这是一个远程监控的上位机软件,一个服务器同时连接很多站点。想定义一个类,用来描述这些站点,每个站点作为一个对象。不知道这种想法合不合理。
我现在想到的问题是站点也许有很多>100个,站点的属性也很多。也就是说每次运行程序时都要先创建这么多的对象,然后还要给没个对象的属性赋初值。这个是不是要占用很长的时间。
还有一个问题比较泛:对象是必需的吗?什么时候要用到对象?什么时候只需要结构就可以了?
请大家赐教,谢谢!
 
用Tlist保存每个站点实例
自定义一个站点类。
说的不对大家谅解
 
我想的也是定义一个站点类,但是这样是不是每次运行程序时都要对很多个对象进行初始化,会不会消耗很多时间,这样做合不合理
 
创建对象很快的啊.飞快.基本可以忽略
 
没个对象有很多属性的,而且属性是存在数据库里的,如果在创建时一一赋初值,还是需要一些时间的吧。
 
你不用站点类你也需要创建100多个其他的东东来保存这些站点的属性。
用站点类只不过是 使程序更加清晰,便于调试、维护,和你所说的速度无关
你即使不用类,也需要这么多时间
 
通过基类继承吧,特殊的就覆盖
 
你可以建立一个站点的类,每个站点是站点类的一个实例。
又于你站点较多,用Tobjectlist来管理实例。它是一个不错的管理实例的对象。
对象不是必须的。但是不用对象是开发不出来好的软件的。
整个软件都应该用面向对象的思想。也就是你应该用面向对象的思想来开发你软件。
 
结构与对象之间的区别在与,对象可以继承,仅此而已。
有一种老的方式可以使结构也具有成员函数,有人说那是类(不通过TObject继承),我倾向于认为,那是结构。
C++的结构就是可以拥有成员函数的。
但是,类很快,不需要考虑他的生成速度。
对象在建立的时候只是要分配的内容稍微多一点,
但是分配20B与200B有差别吗?
你所说的占用资源的代码,是功能码,与框架实现无关的。
 
不知道怎样才叫面向对象,是不是使用了类,定义了对象就是面向对象编程了。总感觉摸不透。而面向过程就比较直观了,一个问题,看看该怎么实现,然后分步骤下来就行了。
to 魏启明:
如果说类与结构的区别仅在于类可以继承,那我想在这里是不是不需要用类了。因为每个站点都是一个层次的,就是说没有什么区别,只需要从同一个类生成实例即可,就是说都不需要继承了。那是不是说就不需要需要用面向对象来实现这个系统了
 
类和结构区别怎么可能仅在于可以继承呢.它们可是两个完全不同的概念
结构里只能包含某种类型的数据字段,注意,这些字段只是数据
而类中除包含这些称为属性的数据字段外,还可以包含称为方法的函数和过程以及事件;
类具有继承,重载,多态等特性.可以很好的封装实例.另外,类的实例是事件驱动的.
这些都是结构不可能具有的.
其他的,你自己看相关资料吧!
 
所谓面向对象,最关键的就是类的封装,同时还有继承性、多态性。通过封装使得一些
方法和数据的访问能有权限的约定,保证某些数据访问的特有性(一致性)。面向对象本身
就是对现实世界的抽象,在保证封装的情况下,实现继承和多态性,以模拟现实各个事物的
处理过程。最大的好处就是代码的重用,通过一个好的面向对象的设计,可以让初始设计的
代码在以后的应用中能继续发挥作用,或者说以后的应用可以从一个设计得好的模板基础
上得到扩展,同时可以增加并实现更多的功能,这就是继承和多态的作用。一个设计得好
的类,最大的优势就体现在数据的良好封装,以及继承和多态性能,为软件的管理以及扩展
提供很大方便。换句话说,如果类设计的不好,那在软件提供使用后,就可能会出现管理、
维护或者扩展上的不便。
以你所要设计的软件来说,用不用面向对象来设计都可以,但结果是有较大差别的。
比如,你以结构来管理站点,可能会在软件运行出现小差错时很难差错、纠错、维护,结
构的成员(即数据)都是隐含为public的,这样大堆数据放在一起就难免会有混乱和差错,
而通过面向对象的类封装,一些数据实现了封装管理(访问权限的控制),就可以容易的进行
维护。另外,作为这样的应用软件,你有可能需要在使用后发现某些方面可以进行扩展,
实现更多功能,这样通过类的继承关系和多态性能,可以方便的扩展。但如果使用一般的
技术,如用结构来管理,那如果要扩展,就得花很多的精力,甚至可能要全部推翻重新设
计。这就是面向对象的最基本的优越之处。
对象实际上是从结构发展来的(结构和类都是一组成员的聚集),在Delphi中,对象变量
需要手工显式创建(在堆中分配内存空间),而结构变量是声明以后分配了空间的。就实现
方面,有很多技术可以对速度进行管理,你可以在需要时进行对象的创建。实际上,对象
的创建并非是费时的事,因为通过继承,子类的众多(如100甚至1000个)对象实例只需完成
对象特定数据及对象方法(函数)成员的初始化,其他已经由类完成了(实现在类VMT表中)。
而用结构的话,不能实现一些对象才特有的方法(函数),而且,结构初始化也要进行合理
设计、也要时间。相比之下,对象机制的众多好处就给了使用面向对象进行设计的充分
理由。
为实现管理维护方便,软件扩展方便,值得使用面向对象编程技术。
>>一些理解,供参考,请指正<<
 
对象,呵呵
如果仅仅是数据成员,那就没必要,而且当对象的种类(数目)很多的时候,管理也是一件很麻烦的事情.
如果有数据成员,还有于之对应的方法,那就用类来封装吧.
OOP=多态+继承.
仅此而已...
 
呵呵,我只是就事论事而已,对象当然不紧紧是继承了。
类的好处体现在
1、封装,封装了具体实现的代码,使外部的接口呈现更简洁,更清晰,封装了类之间的协作,使编程者能具有全局观。
我觉得封装最重要的就是使编程者具有全局观,就像早晨上班,老板大喝一声“做事”,于是秘书开始整理报表,经理开始开会,我开始关掉QQ打开Delphi……
2、继承与多态,(我觉得只两个是一回事,至上是统一的),虚函数和动态函数实现了函数地址的不确定性,从而使得已父类的角度可以执行子类的代码(多态),已子类的角度执行父类的代码(继承)。
//如果仅仅是数据成员,那就没必要,
//而且当对象的种类(数目)很多的时候,管理也是一件很麻烦的事情
我不同意这样的观点,曾经看到一句话“一切子类化”,很激进,然而有道理。
在做程序的时候,分析的再细致,难免有失误的时候,类便于将来的扩展,变化,
结构则是牵一发而动全身
举你的站点为例。
有的以IP为标记,有的以网址标记,有的是FTP,有的仅仅是虚拟机,这些处理各不相同……
四种方式要对应四套结构,四种解析函数,要是增加了呢
而对象的话,一个基类四个子类,子类实现功能,而用户只需了解基类的接口即可
再来个移动设备站点,很轻易的就加上去了
 
没有只有数据成员的结构(包括结构体和对象)
因为数据总需要被使用,被访问,被处理,这就是方法,就是函数,绑在一起要比分开要好
 
演变成类和结构讨论了,呵呵
在C++里面类和结构唯一的差别就是结构默认成员是公有,类默认成员是私有的.仅此而已.
Delphi里面的结构类似以前Pascal或者C语言的结构.但是就内存存储方式来说和类的区别也不是很大.类如果去掉了虚方法/动态方法表(VMT/DMT)的话存储和结构没什么区别.不要说类有函数.其实结构也一样可以用函数指针成员来实现.只是类的构造/析构函数自动完成了初始化/反初始化等动作.
讨论行为的话确实有差异.但是内存存储方式差别确实不是很大.
 
Rec = object
procedure F;
private
A: Integer;
B: Integer;
end;
这就是被称之为原始类的;我称之为带成员函数的结构。
与C++的结构体相同,不同的只是我们有两个指示字而已
淘汰的东西,不推荐使用,我认为C++也不推荐使用带成员函数的结构,有更好的干吗不用
 
谢谢大家的热心!
发现大家都倾向于建议用对象来实现。
对Jonson_sunshine的这段话不太懂:
“实际上,对象的创建并非是费时的事,因为通过继承,子类的众多(如100甚至1000个)对象实例只需完成对象特定数据及对象方法(函数)成员的初始化,其他已经由类完成了(实现在类VMT表中)。”
对象的构造不是都在创建的时候进行的吗,什么叫“已经由类完成了"?
还有,如果站点只有一种情况,也就是说不需要从基类继承多个子类,那么这里的面向对象是不是就只用到了它的封装特性,而没有了继承和多态了?
另外一个问题,说道面向对象的代码的重用性,面向过程中的过程或函数也可以实现重用的,这个有什么区别?(这个重用不知道理解的对不对,呵呵)
 
to 楼主:
再说说我的理解。
对象的构造是显式创建的时候进行的,即调用类的构造函数进行对象的内存分配和一系
列的初始化,问题是构造函数进行了什么工作。类在构造对象时,进行特定的数据空间分
配,并还给每个对象附上一个指向类的VMT表的指针,同一个类的不同对象实例都通过这种
指针共享该类的VMT,也就共享一些方法和函数。对于这些方法和函数,不必为每个对象进
行额外的初始化处理,这就是我说的“其他已经由类完成了”。除去这类VMT指针的分配
外,就是特定数据的空间分配了,不管是否用对象机制,数据的初始化总是需要时间的,而
且这类数据初始化耗时差不多,所以,不应成为选择面向对象方法还是面向过程的依据,重
要的选择依据应该是数据和方法(函数)的封装、继承、多态等,也就是编程方法带来的方便
性和容易维护性,面向对象编程就满足这一要求。
面向对象提供继承和多态,但实不实现就看需要,如果一个设计得好的基类能完成工
作,那就无需派生子类了,但基类提供了派生的功能,也就提供了重用和扩展的机会,以及
提供了子类实现多态(如果需要的话)的基础。
至于说代码重用性,面向过程编程当然也可以实现过程或函数重用,但问题是哪一种方法的重用性更好。面向过程中,假如过程或函数要共享不少数据,那这些数据变量该如何提
供?以全局变量的形式提供,那就很容易混淆。而且将整个工程所需的代码(包括要共享的
过程、函数和数据)全部集中在一个单元文件中,怎么给外部提供使用接口、怎么保证管理
和维护的容易,都是需要解决的。不排除面向过程能通过编写更多代码来解决这些问题,但
层次性和可读性都会大大降低。面向对象编程就可以通过以对象的方式抽象各种操作,封装
数据和操作过程,容易提供代码共享的接口(这当中有个重要概念就是黑盒机制,屏蔽内
部实现,只向外提供使用接口),使代码的层次性明显,重用和维护都较方便。这些都是
面向对象有利的方面。
写了这么多,仅是目前我的理解,希望能提供有益的参考,有错还望指正。
 
后退
顶部