我是大三的学生,这学期开了一门课,“面向对象的程序设计”,老师是用C#讲的。期末考核就是让我们每个人用C#做一个小东西交给她。由于我一直不太喜欢C#的语法,尤其是区分大小写,所以没花时间去学。相对来说我的Delphi要好些,所以,我想用Delphi完成这次作业。
于是我去问老师:我:老师,我C#学的不是很好,能不能用其他工具完成这次作业?老师:不行。我:既然这门课叫“面向对象的程序设计”,而不是叫“C#程序设计”,那我为什么不能用另外的“面向对象”的工具实现呢?老师:好,那你用什么实现?我: Delphi !老师:Delphi不行,Delphi不是“面向对象”,最多算是“基于对象”。我:那我除了Delphi、C#还可以用什么实现?老师:JAVA、C++都可以,他们都是面向对象了,Delphi不是我:……
我一直以为Delphi 是 “面向对象” 的,她怎么说不是。我想,那位老师可是一为博士后啊,说话不会没有根据吧,所以没有当场和她辩论。所以我想来CSDN上听听各位的看法,把这个问题搞清楚一下。各位弟兄,能否告诉我“面向对象”和“基于对象”区别在哪里? Delphi 到底是不是 “面向对象”的?
于是我去问老师:我:老师,我C#学的不是很好,能不能用其他工具完成这次作业?老师:不行。我:既然这门课叫“面向对象的程序设计”,而不是叫“C#程序设计”,那我为什么不能用另外的“面向对象”的工具实现呢?老师:好,那你用什么实现?我: Delphi !老师:Delphi不行,Delphi不是“面向对象”,最多算是“基于对象”。我:那我除了Delphi、C#还可以用什么实现?老师:JAVA、C++都可以,他们都是面向对象了,Delphi不是我:……
我一直以为Delphi 是 “面向对象” 的,她怎么说不是。我想,那位老师可是一为博士后啊,说话不会没有根据吧,所以没有当场和她辩论。所以我想来CSDN上听听各位的看法,把这个问题搞清楚一下。各位弟兄,能否告诉我“面向对象”和“基于对象”区别在哪里? Delphi 到底是不是 “面向对象”的?
Delphi是面向对象的。
现在的老师都是没料的多!唉Delphi当然是OOP,面向对象的,JAVA,C#,VBNet等都是
VB才是基于对象的http://lysoft.7u7.net
多态,继承。
VB是基于对象的。
好多老师都是一样,很虚伪,不懂又不想在学生面前丢人,所以就说....
其实好多学历十分高的老师在具体实现应用上不是很好,他们都是搞“理论的”,哈哈哈哈哈
对应你们老师,我无话说了...
抽象数据类型(ADT)的程序设计,现在通常称为基于对象的程序设计,在基于对象的程序设计方法中
我们通过一组数据抽象来建立问题的模型,这些抽象称为类,与每个类相关的算法成为该类的公有接口
数据以私有形式被存储在每个对象中,对数据的访问应与一般的程序代码隔离开来面向对象的程序设计方法通过继承机制和动态绑定机制扩展了抽象数据类型,继承机制是对现有实现代码的重用,动态绑定是对现有的公有接口的重用,以前独立的类型现在有了类型/子类型的特定关系"c++是一种支持多种程序设计方法的语言,基于过程,基于对象,面向对象,泛型
而delphi也是提供了多种程序设计方法,基于过程,基于对象,面向对象所以你的老师说
delphi最多算是“基于对象”。
简直很错阿
呵呵,不好意思
正在看c++primer,所以就从书上敲了一段
难道java是纯oop????
纯的oop是smalltalk!!!!不过没有什么价值,适合教研!!!
to Demogodyou(大漠孤雕) !!
嘿嘿!
C#和Java是比较纯粹的面向对象语言,不过Delphi可以做出完全面向对象的设计。
它具备面向对象的所有特征: 抽象,封装,多态。
1,以前用delphi时是不是当作另外一个vb来用?
2,oop学得怎么样?
3,期末考核你能用Delphi做出面向对象的设计,而不是另一个基于对象的“vb”设计?如果(问题2回答:不错,很好) AND (问题3回答:是的) 那
就对你老师说,你是怕我用delphi做出基于对象的设计,那我如果交给你那种东西,你直接判我这课0分。
---------------------------
除了泛型,其它都一样,
与 Java C# 一样单继承
以后要多认真学习,Delphi 面向对象程序设计!
拷贝自c++primer"
抽象数据类型(ADT)的程序设计,现在通常称为基于对象的程序设计,在基于对象的程序设计方法中
我们通过一组数据抽象来建立问题的模型,这些抽象称为类,与每个类相关的算法成为该类的公有接口
数据以私有形式被存储在每个对象中,对数据的访问应与一般的程序代码隔离开来面向对象的程序设计方法通过继承机制和动态绑定机制扩展了抽象数据类型,继承机制是对现有实现代码的重用,动态绑定是对现有的公有接口的重用,以前独立的类型现在有了类型/子类型的特定关系"c++是一种支持多种程序设计方法的语言,基于过程,基于对象,面向对象,泛型
而delphi也是提供了多种程序设计方法,基于过程,基于对象,面向对象所以你的老师说
delphi最多算是“基于对象”。
简直很错阿
----------------------
回复:谢谢,从你这里得到了反驳那位老师的有效的理论支持!
*****************************************
yeliming(重返光荣)
Delphi不是纯粹的面向对象,C++也不是。
C#和Java是比较纯粹的面向对象语言,不过Delphi可以做出完全面向对象的设计。
----------------------
回复:请问什么叫“纯粹的面向对象”,她和Delphi这种“非纯粹的”区别在哪里?小弟不解。谢谢
*****************************************
6rl(海)
先问一下你自己:
1,以前用delphi时是不是当作另外一个vb来用?
2,oop学得怎么样?
3,期末考核你能用Delphi做出面向对象的设计,而不是另一个基于对象的“vb”设计?如果(问题2回答:不错,很好) AND (问题3回答:是的) 那
就对你老师说,你是怕我用delphi做出基于对象的设计,那我如果交给你那种东西,你直接判我这课0分。
-----------------------
回复:
(1)呵呵,惭愧,小弟目前确实是把Delphi当成VB来用的
(2)现在想接触一下她的OOP特性,借了一本刘艺的书来看,发现看不懂,正回过头去补 Object Pascal
(3)我们开的这门课虽然叫《面向对象的程序设计》,但是我们的老师却是也是把C#当成VB来讲的,面向对象的多态根本没提到,封装、继承也只在第一堂课的时候第一堂课的时候提了一下,其余的课都是教我们“拖控件”或者自己去机房上机。对于这样的老师我教一个用delphi拖控件的程序已经算是给她面子了。
不过话说回来,我确实不清楚怎样用Delphi设计程序才是“面向对象的”。而且我请教过一位大我一届的学长,他从高中就开始用Delphi编程,而且有过一些实用的作品。可是他到现在任然是把delphi当成VB用的。那位弟兄能指点一下,到底怎样用Delphi设计程序才是“面向对象的”?小弟先谢过。
*****************************************
ZyxIp(绝望中...)
如果你们老师是教音乐的,他会说:钢琴,小提琴是音乐,二胡不是音乐. 面象对象更是一种思想,封装,继承,多态是它的总的抽象的表现方式,音乐只需要演奏工具能发声就………
-----------------------
回复:呵呵,精彩,搞文学的吧。
*****************************************
这 就要靠程序员的分能力析和对要实现的工作的了解程序了.我们在不了解一个业务的时候总是认
为某此方式是属于这个类的,表面上看起来也确实如此,但在深入的了解了了业务关系后就觉得其实
放在这里不合适,应将它分出去.所以并不是程序中全是类就可以了,函数也其实是一种封装,每个函
数都只应完成一件事情,如果写了一个好几十行的函数就应看看它是不是应分解成几个独立的函数了.继承:封装要求类只完成自己的工作,但肯定很多类都要完成一件共同的事情,如果要将这一部分独立
成一个类,就会有很多类引用它,这在一定程度上破坏了它的封装性,而且如何修改了这个共同引用的类就会
引起其它很多类,这时继承的做用就体现出来了.子类可以继承父类的方式和属性,父类的修改不会影响到子类,
当然一个设计很差的类例处.多态:简单的说就是为了简单,你可以定义一个叫"芝麻开门"的方法,对着家门,冰箱,书,鸡蛋 分别喊一声,它
们各自都用以自己的方式打开.怎么用DELPHI设计程序才是面象对象,就象在说怎么样二胡拉出来的才是音乐一样.DELPHI中只要会定义对象,定一个子类,实现一个多态的方法,就算你掌握了工具.具体的例子就是你看别人的代码,然后想它为什么这样设计,划分.将自己写过的程序重新设计一次,觉得那些业务应是一个类,业务之间有什么关系.比如一个小的图书管理系统,要实现的功能是:录入书的信息,保存到数据库中.如何实现:是准备立刻在一个窗体上放一个DBGRID,ADOQUERY,放几个BUTTON,在窗体启动时加载数据,在按钮下
写保存的代码实现;还是先想想程序在实现上应分解成几个类,然后实现每个类,最后在窗体中调用.
TBookInfo_Rec=Record
ID:integer;
Caption:String;
.....
end;//读出数据时的回调函数。
TOnReadBookListEvent =procedure (Const Value:TBookInfo_Rec);//书列表
TBooKList_Obj=Class
private
AOwner:TDBBook_Obj;
procedure OnReadBookList(Const Value:TBookInfo_Rec);
public
constructor Create(ADBBook:TDBBook_Obj);
Function Count:integer;
Function Items[Index:integer]:TBookInfo_Rec Read GetBookInfo Write SetBookInfo;
Function Del(BookID:Integer):Boolean;
Procedure Refresh;//调用TDBBook_Obj的ReadBookList读出所有的数据.
end;
//将一本书的信息显示到ListView的一行
procedure BookInfoToListItem(ABookInfo:TBookInfo_Rec;AListItem:TListItem);
//将列表中的信息显示到ListView中
procedure BoolListToListView(ABoolList:TBookList;AListView:TListView);//数据库操作
TDBBook_Obj=Class
private
FADOConn:TADOConnectiton;
public
constructor Create(AConnStr:String);
procedure ReadBookList(AOnReadBookListEvent:TOnReadBookListEvent);
Function Del(BookID:Integer):Boolean;
Function Add(Const Value:TBookInfo_Rec):integer;
Function Edit(ACaption:String...):Boolean;
end;将上面的两个类实现了.在窗体中放按钮,和ListView来实现,这里窗体类只是管显示,数据操作类只窗操作数据.相当于客户层(窗体),应用层(TBooKList_Obj),数据层(TDBBook_Obj) 这样如果数据库由Access换成SQLSERVER了,只要重新实现TDBBook_Obj就可以了.
我想这算最简单的面象对象应用吧,只是用了封装的概念.用面象对象编程的思想设计,至于设计的好坏和用什么设计没有绝对关系.个人看法,请大家指正.
说他是,他就是,不是也是!
听了你的话对我的启发太大了,以前我写的程序在按照你的分析后感觉全都是垃圾。我也学过面向对象的思想,但是一到实际编程总是用不上,不知道是不会用还是不敢用。以后写代码要多用面向对象的思想去考虑。
^^^^
面向对象的程序设计一定要用支持面向对像的开发语言才能作得到嘛?
对象的程序设计只是一种设计方法, 让程序员从抽像实体(现实)世界的角度去考虑问题, 这样就可以独立出对像的属性, 行为, 事件, 这点 delphi 作得很好; c++ 没有事件, 当然也可以做得到; 而C# 的开发者跟 Delphi 是同一个大师--Anders, 所以也差不多; java是一种解释语言, 有些术语上有点不同; VB呵, 当然也行. 这些都是支持 class 的语言, 那么C语言行不行?
你用 Object-Oriented Programming With ANSI-C 或 Object Oriented Programming in C 去找找, 世界上不至一个程序员想这么干, 因为在不少的环境中是没有支持面你对像语言的.
priavte
FName:String;
public
Procedure Open;virtual; abstract;
function Save:Boolean;virtual; abstract;
end;
{案卷,自己定义的数据类型}
TFileDoc_Obj=Class
public
Procedure Open;override;
function Save:Boolean;override;
end;
文档
TFileBook_Obj=Class
public
Procedure Open;override;
function Save:Boolean;override;
end;有两个窗体 TWinFileDoc ,TWinFileBook 在Open方法中用来显示各自己类型的文件.当然在SAVE的时候是调用TDBBook_Obj人的保存方法.在设计中还要考虑各种数据的在内存中的存在方式. 用WINDOWS系统中堆的方式来实现是最好的.
function HeapAlloc; external kernel32 name 'HeapAlloc';
function HeapCompact; external kernel32 name 'HeapCompact';
function HeapCreate; external kernel32 name 'HeapCreate';
function HeapDestroy; external kernel32 name 'HeapDestroy';
function HeapFree; external kernel32 name 'HeapFree';
function HeapLock; external kernel32 name 'HeapLock';
function HeapReAlloc; external kernel32 name 'HeapReAlloc';
function HeapSize; external kernel32 name 'HeapSize';
function HeapUnlock; external kernel32 name 'HeapUnlock';
function HeapValidate; external kernel32 name 'HeapValidate';
function HeapWalk; external kernel32 name 'HeapWalk';这些是创建和使用堆时用的API,关于它的使用在<WINDOWS核心编程>一书中讲的很清楚。我原来
也只是随便的创建对象,不管数据在内存中的布局,如果类的管理能达到内存布局级别,程序结构的
完整性和易于维护性上将大大提高. 这也是看了书后才明白和体会到的.大家对这些有什么自己的看法请交流一下,这些是自己的体会,不知道真正的编程高手是如何实现系统的.有哪些实用的技巧,虽然现在都说编程不需要技巧,但我想设计上的技巧才是真正的技术.
谢谢,您的回贴我收藏了。
回复:getit911(Windows转Linux中) :
同意,现在很多大学老师讲课都很随便,很不负责任。但这不能完全的怪他们自身。首先,学校的导向就很有问题。拿我们学校来说,是只重视科研,不重视教学的。一位老师如果安安心心的教好他的课,一个月的薪水就两千多一点,而他要是在国内的一级刊物上发表一篇论文的话,奖励五万。而且职称的评定、住房的分配等,都是直接或间接与论文数有关,而与学生的就业率和就业层次则完全不挂钩。所以,老师们轻教学也是自然的。当然,高校中也存在淡薄名利的好老师,不过真的太少了。我对大学比较失望。
有很多经典的软件是面向过程开发的mis系统可能需要oop的多些,如果是控制系统,开发语言都是汇编、c等,没法用oop,用oop,执行效率也是问题,我们的导弹、火箭上用汇编写的面向过程的东西要比oop的东西多得多