登陆注册
8724600000023

第23章 软件构造(2)

一旦定义了一个对象的特性,则有必要决定这些特性的可见性,即哪些特性对外部世界是可见的,哪些特性用于表示内部状态。在这个阶段定义对象的接口。通常,应禁止直接访问一个对象的实际表示,而应通过操作接口访问对象,这称为信息隐藏。事实上,信息隐藏是用户对封装性的认识,封装则为信息隐藏提供支持。封装保证了模块具有较好的独立性,使得程序维护修改较为容易。对应用程序的修改仅限于类的内部,因而可以将应用程序修改带来的影响减少到最低限度。

4.多态性

多态性是指允许不同类的对象对同一消息作出响应。比如同样的加法,把两个时间加在一起和把两个整数加在一起肯定完全不同。又比如,同样的选择编辑—粘贴操作,在文字处理程序和绘图程序中有不同的效果。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好地解决了应用程序函数同名问题。

6.3.2面向对象的开发的优点

面向对象开发时间短,效率高,可靠性高,所开发的程序更强壮。由于面向对象编程的可重用性,可以在应用程序中大量采用成熟的类库,从而缩短了开发时间。

应用程序更易于维护、更新和升级。继承和封装使得应用程序的修改带来的影响更加局部化。

可扩充性:面向对象编程从本质上支持扩充性。如果有一个具有某种功能的类,就可以很快地扩充这个类,创建一个具有扩充功能的类。

代码重用:由于功能是被封装在类中的,并且类是作为一个独立实体而存在的,提供一个类库就非常简单了。事实上,任何一个.NET Framework编程语言的程序员都可以使用.NET Framework类库,.NET Framework类库提供了很多的功能。而且我们可以通过提供符合需求的类来扩充这些功能。

6.3.3如何使用名称空间

名称空间的概念是.NET框架中重要的概念,因为它可以决定哪个类可以被组成逻辑组的机制,并且使得这些类更容易的搜索及管理。在Namespace...EndNamespace块之间声明的任何类、结构等将可以使用那个名称空间被寻址,在VB.NET中名称空间是使用块结构来声明的。例如:

Namespace Name Space A

Public Class Class One

End Class

End Namespace

类可以使用这个名称空间来引用,这样定义一个变量就变成了:

Private obj As Name SpaceA.Class One

因为名称空间是使用块结构来创建的,所以在单一的源文件中就不仅可以包含多个类,而且可以包含多个名称空间。同样,在相同名称空间的类可以被创建在分隔的文件中。换句话说,在一个VB.NET工程中,我们可以使用在不同源文件中相同的名称空间,而所有在这些名称空间中的类将是那个相同名称空间的一部分。

为了更好地理解,下面再给出一个源文件:

Namespace Name Space A

Public Class Class One

End Class

End Namespace

在工程中还有以下一个独立的源文件,其代码如下:

Namespace Name Space A

Public Class Class Two

End Class

End Namespace

以上的两段代码是为了说明在同一个名称空间NameSpaceA中有两个类:ClassOne和ClassTwo。

这里还需指出,在默认状态下,VB.NET工程有一个默认的根名空间(root namespace),它实际上是工程属性的一部分。这个根名空间使用了与工程相同的名字。所以当使用名称空间块结构的时候,实际上是增加到根名空间上去。因此,如果工程命名为MyProject,那么可以这样来定义一个变量:

Private obj As My Project.My Namespace.Class One

在.NET开发中,.NET Framework类库就是这样组织的,其中有80多个名字空间,经常使用的名字空间包括System、System.IO、System.Drawing、System.Windows.Forms等。

如果要在程序中使用名字空间,可以首先导入它,以便在以后每次使用其成员时无须重复该名字空间的名字。例如,导入名字空间System可以使用这个名称空间中的Console方法。

Imports System

Class Person

Dim salary As integer=10

Dim yearlyBonus As integer=10

Public Sub PrintSalary()

Console.Write(salary)

End Sub

Public Shared Sub Main()

Dim person As Person

person=New Person()

person.PrintSalary()

End Sub

End Class

还可以在不同的名字空间中拥有相同名字的类。要正确地使用一个类,通常的做法是在一个类的前面使用名字空间的名字。例如,可以以System.Console的方式使用System名字空间中的Console类。

6.3.4面向对象的实现

1.如何使用类

在面向对象编程技术中,类是重点中的重点。简单地说,类是一种提供一定功能的数据类型。在VB.NET中定义一个类要用到关键字Class。以下定义了一个Person类:

Class Person

End Class

类里面还可以定义自己的属性和方法。

2.如何创建属性

在类中创建属性比较简单。

Private Myname As String

Public Property Name()As String

Get

Return Myname

End Get

Set

Myname=Value

End Set

3.如何创建类方法

一个类有象域、属性、子程序和函数等成员。例如,下面的Person类中有一个名字为DoSomething的方法。

包含DoSomething方法的Person类。

Class Person

Public Sub DoSomething()

End Sub

End Class

子程序和函数都被称为方法。

另一种类成员是成员变量。下面的代码定义了含有salary和quarterlyBonus两个成员变量的Person类,并给出了一个简单的应用实例:

Class Person

Dim salary As integer=10

Dim yearlyBonus As integer=10

Public Sub PrintSalary()

System.Console.Write(salary)

End Sub

End Class

Module Module1

Public Sub Main()

Dim aperson As Person

aperson=New Person()

aperson.PrintSalary()

End Sub

End Module

上述代码段中的Module1模块中提供了子程序的Main函数,这也是VB.NET程序开始的地方。要编译源程序,就必须用一种或另一种方式提供访问MainSub的途径。

如果使用的不是VisualStudio.NET,那么可以使用vbc.exe软件编译VB.NET源程序,vbc.exe是在安装.NET Framework时自动安装的。例如,当把源代码保存为Person.vb文件后,在Person.vb所在的目录下,输入vbcPerson.vb即可编译该源程序。

现在再来看看上面的代码,子程序的Main函数首先定义了一个Person类型的变量aperson,

Dim aperson As Person

然后使用关键词New对Person进行初始化,

aperson=New Person()

这样,就得到了一个Person类型的变量,然后就可以使用它的功能了。在例子中,可以使用下面的方法调用PrintSalary方法,

aperson.PrintSalary()

这一方法会打印Person中salary变量的值。

当然,也可以将子程序的Main函数移到类的定义中去,这样就无须再使用模块了。下面的代码即演示了这种方法:

子程序的Main函数在类的定义中

Class Person

Dim salary As integer=10

Dim yearlyBonus As integer=10

Public Sub PrintSalary()

System.Console.Write(salary)

End Sub

Public Shared Sub Main()

Dim person As Person

person=New Person()

person. PrintSalary()

End Sub

End Class

4.如何使用重载方法

VB.NET的另外一个新特性是有重载方法的能力。重载的意思是,只要每一次的声明都有不同的参数列表,就可以在一个类中多次声明相同名字的方法。不同的参数列表意味着在列表中不同类型的数据类型。假如在刚才的Person类中方法printSalary要根据不同的参数类型来进行打印工资。以下可以定义:

public overloads sub PrintSalary(byval name as String)

dosomething()

end sub

public overloads sub printSalary( byval name as string)

doSomething()

end sub

仔细观察可以发现,两种方法的声明都是有相同的方法名字。这一点在VB6.0中就是不行的,它要求每一个方法名字都不一样。但是,在VB.NET中就允许存在相同名字的方法,但其参数要求是不同的。值得一提的是,每一个声明都要加入Overloads关键字。当重载一个方法的时候,可以使用Public、Friend等辖域关键字让它有不同的作用域,具体做法只要使用不同的参数列表即可。重载是多态的一种形式。

5.如何进行构造和析构

对象构造是在创建一个类实例的时候触发的。具体可以使用关键字NEW来实现它。这个构造函数有完整的错误处理能力并可以接收参数。所以可以在创建对象的时候来对它们进行初始化,这是VB.NET一个十分重要的特性。VB.NET中构造函数方法是SubNew。

Public Class Person

Public Sub New()

(在这里初始化对象)

End Sub

End Class

利用这种类型的构造函数,可以如下创建类的实例:

Dim obj As New Person()

但是,在创建对象的时候往往要用数据来初始化对象。可以从数据库中来装载一些数据,或者可以直接为对象提供数据。不管用什么方法,都是想在对象被创建的时候为它提供一些数据。为了做到这点,可以增加参数列表给New方法:

Public Class Person

Public Sub New(ByVal Name As String)

Myname=name

End Sub

End Class

现在来创建类的一个实例,并且为对象提供数据,代码如下:

Dim obj As New Person(”张飞”)

为了增加灵活性,可以接收可选的参数数值。可以有两种实现方法:通过使用Optional关键字来声明一个可选择的参数,或者通过重载New方法。为了使用Optional关键字,简单地声明可选择的参数,代码如下:

Public Sub New(Optional ByVal name As String=””)

If name=””Then

(这里可以初始化对象)

Else

’这里用姓名进行初始化

Myname=name

End If

End Sub

但是这种方法太过于理想化了,因为不得不检查参数是否已经提供,然后决定怎样初始化对象。New方法有两个路径可以实现。第一种是对于每种行为类型而言的,它可以通过重载来实现:

Public Overloads Sub New()

(这里可以初始化对象)

End Sub

Public Overloads Sub New(ByVal name As String)

(这里可以使用name数值来初始化对象)

End Sub

同类推荐
  • 如何选购电脑

    如何选购电脑

    本书以问答的形式介绍了选购电脑的基本知识。内容包括:电脑的组成、选购电脑的技巧、主机的部件构成、主板的主要类型、CPU的性能指标等。
  • 现代企业财务软件应用教程

    现代企业财务软件应用教程

    本书内容包括财务软件概论、系统管理、企业应用平台、总账管理、报表管理、薪资管理、固定资产管理、应收款管理、应付款管理等。
  • 中文版3dsMax2010实例与操作

    中文版3dsMax2010实例与操作

    本书结合3dsMax2010的实际用途,按照系统、实用、易学、易用的原则,通过大量案例介绍了3dsMax2010的各项功能,内容涵盖3dsMax入门、创建和编辑二维图形、创建基本三维模型、使用修改器、网格建模、多边形建模、面片建模、复合建模、材质和贴图、灯光和摄影机、渲染、动画制作、粒子系统、空间扭曲和动力学等。
  • 创业在微软

    创业在微软

    身处软件巨擘微软之中,何来“创业”二字?本书详尽勾勒了微软亚洲工程院(ATC)的成长历程,披露了工程院人在“创业”过程中不为人知的种种酸甜苦辣,生动展现了工程院的独特文化,并从另一个角度展现了其领袖人物张宏江博士的心路历程和管理思想。
  • 成为淘宝创业的超级毕业生

    成为淘宝创业的超级毕业生

    本书讲述如何通过淘宝创业将大学在校生打造成为“超级毕业生”。主要内容包括大学生从事淘宝创业的理论基础、学以致用的操作指南,以及可资借鉴的案例。书中的理念篇可供对创业教育感兴趣的高校教师参考;实战篇提出的“淘宝十二招”,操作简单,易学易用;案例篇讲述了十位成功在校创业大学生的故事,主要供学生参考。读完本书,相信凡是关注大学教育者或希望通过淘宝创业的大学生,皆能从中获得启发,对创业从无心变有心,从有心变行动,亲身投入或参与到这个伟大的事业中来。
热门推荐
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 九亭戒

    九亭戒

    求长生,与天争命。成至尊,勘破天道。且看废柴少年如何勘破天道,成就仙途。执神戒,练轮回,九转阴阳。一神界至尊为何九次转世。仙府双显,万年预言。此预言到底是什么?两位神界至尊的师傅到底是谁?
  • 首席一笑误终身

    首席一笑误终身

    【新书强势来袭,逆袭娇妻:造孽老公行行好,等你订阅中……】"他从未想过一个女人,不,一个女孩可以影响他这么久“哥哥,疼……小小给呼呼”多年之后的再见面,她依旧可以轻易撩动他的心“虽然你救了我,不过能不能不要动手动脚……”她嫌弃的看了他一眼。他知道她心中始终藏着那段无法忘却的伤痛“宝宝,我愿用我的生命,换回当年你的纯真无邪。”当她知道他是当年的他,她就早已沦陷"
  • 医妃倾城:丑女三小姐

    医妃倾城:丑女三小姐

    一朝穿越。沈倾诺从一个受人尊敬的医生变成了一个受尽白眼的丑八怪。不过这并不耽误她在古代混的风生水起——斗庶母、气恶姐、把沈家弄得鸡犬不宁乱七八糟。好事不出门,坏事传千里。京城更是传言:沈家三小姐,相貌丑陋不学无术,谁要是娶了她更是灾祸连连殃及满门。漫天的流言在前她就当不知,嫁不出去也全然不在意,每天养养花种种草生活的倒是比从前更顺心。可谁能告诉她,这个突然出现又管她叫娘的小包子是什么鬼?——别说生养,她连嫁娶都不曾啊!于是京城又有了传言:沈家三小姐未婚先孕!于是有一大堆的人又去发掘真相……结果得出:那是楚王苏沐白的娃!
  • 天命之域

    天命之域

    弹指之间,万道颤动。。。呼吸之间,周天崩裂。。。纵然是创界之主又能如何?在那被混沌之力笼罩住的天命世界,所有的人都为这所谓的混沌之力而走火入魔。。。来自青木镇的少年,为了改变这被混沌之力所扭曲的世界,走出青木镇,继承父望,为了那虚无缥缈之路而奋斗终生!!所有人无时无刻都身处危险之中,只不过,他们都未曾意识到罢了。。。
  • TFBOYS之让我爱上你

    TFBOYS之让我爱上你

    女主角,夏芷,男主角,tfboys。至于简介,我就不写了,读者们,还是看吧。不好意思哈。纯属小说虚构,不要上身本人。
  • 当黎明时

    当黎明时

    这是一篇散文,描写黎明时的景色,我经常会在梦中看到如此动人的黎明,所以决定用文字将它描绘下来。
  • King玩家

    King玩家

    莫名其妙进入了一个游戏,在死亡的威胁下,其他人都怕得要死的时候,叶观锦面不改色淡定地吃东西……——佛系少年了解一下。叶观锦处世哲学:“得之我幸,失之我命船到桥头自然直躲得过初一躲不过十五,该来的总会来,所以,冷静点莫慌”苟活了多个游戏世界后……“大佬罩我!!!”叶观锦:???.这就是一个打游戏通关的故事这就是一个一边游戏一边撩的故事这就是一个用生命谈恋爱(雾)的故事书名不重要,瞎取。
  • 王妃别跑:我还要

    王妃别跑:我还要

    麒麟朝天一吼爪子生风朝着欧阳定熙扑去,欧阳定熙只觉得面前一股强风而过,他面色一惊很快的反应过来足尖一点飞离了麒麟的眼前,他松了口气,没想到这只麒麟的本事不小,攻击力够强,但是他喜欢挑战,敌人越强大他就越兴奋!云明荟眼底泛起一阵水雾她感动的点了点头,就算是失去一身武艺可那又怎样?至少她可以和叶大哥永远的在一起了。
  • 都市御妖师

    都市御妖师

    非我族类,皆为妖!然而在都市中,人妖却是共处。封妖家族的公子,潜入都市,发现隐藏在黑暗下的协议。封印的妖孽出世,封妖家族和妖的协议成为了一纸空文。第二次封妖家族和妖的大战就要爆发,繁华的都市面临坍台的危险。一扇门从天而降,连接另外一个世界,九州天下,所谓的妖竟然只是一缕精气神。混沌初开,分阴阳二气,衍轮回之理。生死循环,谁能超脱,执掌乾坤,封妖传承的秘密终于浮出水面……