走近VB.Net(五) VB.Net核心概念
VB.Net中文教程在行文上有些重复太多甚至有些啰嗦,以至让人读得索然无味,但是,这个VB.Net中文教程确实是很难得甚至可以说是经典的VB.Net文章。说老实一点,除了读得累一些外,实在是比我写的好多少倍。第二个问题就是很多人谈到很惨,说一切要从头学起,其实所要你学的不过是一些简单的语法变化,最重要的是观念的改变,也就是思维方式的转向,也就是说在经过了最初的摸索以后,你在VB6(我是不懂VB6的,我只懂一些D(不是你想的那个D),没有面向对象成功,现在我决定学这个了)的功力一样会运用得酣畅淋漓。另外一些提到Beta版的问题,因为编程语言不同一般的软件,虽然是Beta,基本的语法已经定向,微软发布的的关于Beta2的文章中所涉及的主要是一些内部的组件的功能提高与Bug的修正,关键是VB6在让你用得很舒服的同时也为你进行了很大的局限性,而VB.Net正是突破这些局限,另外在前不久有一些不利的传言,这大部分是出现在VB.Net发布之前出现的。很多人甚至断言在VS.Net中不再有VB了。而现在恰恰相反。最早宣称VS.Net取材Java的一篇英文文章的作者在近期的撰文中声称更正以前的说法,他们只是要表面很象,而内部的是实现途径是完全不同的,因为我不是很懂这些,就不谈题外话了。所以对种种传言一定要是非分明,如果你不想落后,你必须学习新兴的东西,而你根本不必太过去关注一些太大的话题,例如将来VS.Net的通用语言库会不会运行于所有的平台,起码我只关心能不能做出好的windows程序,如果到了你必须关心这些大事的程度,这里所有的说明对于你的水平来说只是废话了。下面是我读VB.Net中文教程的一些评述,兼答复一些关于我的文章的问题
一。对象(Object)基本概念
我们且看如下一段:
原文如下“软件的对象是自然界对象的抽象表示”
原文如下“现在的「对象导向」(Object-Oriented) 观念﹐在软件开发时﹐甚至写程序时﹐对象(Object)成为脑海里的主角。当您看到程序时﹐心理充满着对象之影子和概念﹐函数和资料变成对象内之一部分﹐是配角而非主角了。程序设计之核心工作在于描述对象、组织对象、安排对象间之沟通(传递讯息)方式。就如同「人」是社会中的主要对象﹐社会是有组织的人群﹐人们之间会互相沟通、协调。”
对象的其本观念取材于社会,程序的组织抽象于社会的组织,从写软件到组织软件的形式就是进步
原文如下“由于软件中的对象观念和实际社会中的对象观念是一致的﹐所以 OOP观念使软件与实际世界间之距离缩短了。此为 OOP技术的重要特点之一。”
什么是OOP,一个软件工程包括操作系统就是一个微缩的社会群体。比如我们同路人打个招呼,只要打招呼就可以,你要关心的是亲疏的程度,怎样打招呼,而不必关心你的大脑如何接受这个信息,甚至如何发送这个信息,以及如何处理这个信息.
一个Namespce就是这样一个群体(族,我取的是抽象的意义,也就是网友说的“a group of thing with common features (族).当然你完全有理由叫他名称空间,名字空间,命名空间,名空间"。进而到族与族的关系,群体到群体的关系。
因此,
原文如下“例如﹕函数或程序导向之核心观念──函数﹐在一般人们的心目中﹐并非熟悉之概念﹐只在数学里学到之概念而已。因而让人对软件感到陌生。而在对象导向观念中﹐实际社会之对象﹐例如﹕人、汽车、股票、磁盘驱动器、帐单、房间、学生、教室等皆为软件设计师脑海中的对象﹐也是程序中的对象。因之﹐不论是老板或程序设计师来看程序﹐他们脑海中皆充满对象之影子﹐而这些个体皆为人们生活中﹐真正活生生的东西、实在之物体或大家耳熟能详之概念﹐使得软件之使用者和设计者有一致的心灵、共同之感觉﹐这让使用者对软件更满意﹐设计师更了解使用者之需要。”
也就是你作为一个人的对象想从一个位置到另外一个位置,如"S=I.tostring" ,我从I到S,I是在Integer,而S居于String.于是我过去了,从integer到string。而不必要关心他如何的过去。使用哪一个函数。
再看类别
原文如下"以上介绍的是常用之寻找对象方法﹐会寻找对象之后﹐就必需将对象分门别类﹐并且了解类别间之关系﹐以便把它们组织起来。例如﹐在公司的人事结构中﹐可发现人因扮演角色之不同而分为不同种类之对象﹐如推销员、司机、经理等等。汽车可分为跑车、巴士、旅行车等不同种类之对象。如何分类(Classification)﹐是OOP 之重要观念"
有网友拿我开玩笑,说namespace叫族,那么这个class叫班级,不知这个玩笑对我们倒是有些启发的,同样是类别,A班级与B班级到头都是学生的团体,也就是说不能形成一个类,而且学生毕业了,A班级会被C班级所取代,B班级以会被D班级所更替,所以他是有寿命的,而人类是一个类,学生是一个类,老师是一个类,这个是无寿命的。如form是一个类,form类是一直都在的,而formX在unload以后结束了, formX也就没有了
原文如下“例如﹐一个人从出生到老﹐不超过二百年﹐而「人类」则因对象生生不息而永远昌隆。在学校里﹐King老师会换工作而离开学校﹐但「老师」类别将永远存在。因之﹐个体及其所属的群体──类别﹐皆是 OOP之核心观念”
在看了以上一些引用后,你可能会想到,对于这些近于艺术化的解释,中文的表述还是比较好的
二。对象Whole-Part关系
原文如下“类别继承(Class inheritance)和对象组合(Object composition)是软件再使用(Reuse)的两大法宝。类别继承就是建立父、子类别之关系﹔例如﹐「学生」可分为「大学生」、「中学生」和「小学生」三类别”
类别继承(Class inheritance)大概是人人都知道了,至于对象组合(Object composition)你把他理解为你自已写的一个族就很容易理解了,类通过建立子类成为族,虽然没有明确的这样定义,但是有助于理解,如system.drawing你可以理解为一个类,或者说类库也可以,同样因为含有子类,你也可以把system.drawing当作一个族名(namespace),这个子类与通过继承关系
得到的子类意思不同,这不难理解,形象的如下:
Class class1 'Whole
Class class1-1 'Part1
.......
end Class
Class class1-2 'Part2
......
end Class
......
end Class
原文如下"对象组合的目的是﹕创造「复合对象」(Composite object)﹔例如﹐医院内含医师和护士等"
原文如下"继承与组合两大法宝能联合使用﹐以组织庞大的软件系统"
1。原文如下“组合/部分关系﹐常称为APO(A part of)关系”
Class House 房子House是一个整体
Class Door 门Door是一个部分
。。。。。。
End Class
Class Window 窗Window是一个部分
。。。。。。
End Class
。。。。。。。
End Class
原文如下“House 之对象诞生后﹐立即诞生内含之Door对象和Window对象”
所谓诞生对象就是声明一个实例,如 dim xxx as new hourse(房子)
原文如下“组合对象与部分对象的寿命应该是一致的”
2。 原文如下“司机不是汽车的零件﹐客人亦非巴士之组件﹐所以汽车与司机之间并非「组合/部分」关系﹔然而﹐汽车的确包含着司机﹐因之称为「包含者/内容」(Container-contents)关系。”
这个是一个平行的关系,如:
class i(司机)
dim x as string
.......
end class
class h(汽车)
dim myi as new i
myi.x.......
......
end class
现在i没钱了,要到h的公司里打工(dim myi as new i),i的数据x(dim x as string)只好交给myi.x为h服务,所以哪天环境变了,也可以反过来,h为i打工。所以是一个客体了。
所以,原文如下:“司机和汽车为独立之对象﹐不像引擎一直包含于汽车内﹔于驾驶汽车时﹐司机才被包含于汽车内。显然地﹐司机与汽车之寿命不一样长。”
3。原文如下:“集合意谓着「团体」(Group) ﹐由其成员(Member)组成的群体。例如﹐学校里的社团内有团员﹔公司的销售部含有推销人员。这团体并不像汽车实际包含着司机﹐而只是其成员之集合而已。这情形﹐统称为「集合/成员」(Collection-members)关系”
也就是说在「包含者/内容」中包含者是容器,而在「集合/成员」中集合并不是容器
原文如下“不需明确划分「包含者/内容」和「集合/成员」两种关系”
那么,成员与内容有什么不同呢,准确的说,内容是一个对象,而成员是对象的集合,而这个对象的集合又被被含在整体中,而且认为这个成员即可以是外来的,又可以是本来就有的。就好比公司的成员即可以是外面请来的,又可以是内招的。这个意思有些象列表框,列表框的列表项可以是本来就有的,又可以不停的添加进来。「包含者/内容」(Container-contents)是跑单帮,这个就是有组织的了。包含者更象一个容器,而集合反而成为对象。这就成了「包含者/集合/成员」,如果内容是一个变量,集合就是一个数组。
Class Person(成员对象--个人)
。。。。。。
End Class
Class Club(集合对象--俱乐部)
。。。。。。
Private pa As ArrayList = New ArrayList() (建立了一个集合ArrayList类,这个类的方法有Add ;Remove等)
Public Sub join(ByVal p As Person)(ByVal p As Person起到了类似dim p as person的作用,引进了一个“内容”)
pa.Add(p) (把"内容"添加到一个"集合")
End Sub
End Class
三.关于封装性
所谓封装性就是在类与类之间设定合法之存取规律
Public 关键字指定在类与类之间是公用的
Protected 关键字指定在同一个类(族)之间是公用的,包括他的子类
原文如下“指定某些资料为家族公用﹐亦即只有子孙类别内之程序可取用﹐非子孙类别之程序必须呼叫家族内之程序代为存取。”
细心的读者可能已注意到这里已经使用了“ 家族”的说法,印证了族的定义。
Private 关键字指定是私有的,不能外部存取,也不能在族内共享,只能在他自已的空间活动了。
如果想访问Private的对象,只有使用set;get写一个接口,或者使用这个对象内的子过程或函数去执行了,当然你要加上Public在sub或function前面了。
四.父子对象关系(继承关系),母子对象关系(Whole-Part关系)
我突然不想写了,大家可别生气,如果想了解更多,还是去看人家的教程吧,我专挑一些容易的看,可不要学我,这样难免断章取义(是不好的)。另外各位要是看出错误来就请指证,这个反正大家是探讨。如果有想骂的,最好到我的论坛去发泄一下(人少),好歹给兄弟一些面子。最好是看得生气了,以至于水平很好又不喜欢写文章的气得写VB.Net了,英文很好又不喜欢翻译的气得去翻译VB.Net了,我们这一大群“文忙”就有福了(不需要再看我这些劣质文章了)。
VB.Net中文站网址:http://vbnetcn.126.com