登陆注册
8724600000024

第24章 软件构造(3)

这种方法不仅可以避免有条件的检查和简化代码,而且它还使得对于客户代码对象的使用变得更清晰。这个重载New方法可以使用参数也可以不用参数,有很大的灵活性。实际上,通过重载,可以创建许多不同的构造函数,也可以利用许多种不同的方法来初始化我们的对象。在VB.NET中构造函数方法是可选的。但是只有一个例外,那就是当使用继承的时候,父类就只有一个构造函数需要参数。不像COM,.NET不是使用引用计数来决定对象是否被终止的。取而代之的是,它使用了一个有名的“垃圾收集”方案来终止对象。实际上,它的意思是在VB.NET中,不用预先定一个对象的终止方案,因此就不能准确地预测对象什么时候被终止的。下面我们详细探讨一下“垃圾收集”。

在.NET中,引用计数不是一个基础功能部分。相反,对象是通过一个“垃圾收集”机制被终止。在某特定的时间(这决定特殊的规则),一个任务会在所有的对象中运行来查找那些已经没有被引用的对象,并且将这些对象终止,即所谓的“垃圾收集”。

由以上的讨论可以知道,不能准确地知道对象是在什么时候被终止的。除去对象的所有引用之后,并不是意味着对象快速地被终止了。此时对象还存在于内存中,直到“垃圾收集”处理程序运行之后才将它从内存中清除。

“垃圾收集”的主要好处是它清除了由引用计数带来的循环应用问题。如果两个对象互相有引用,并且在程序中没有其他互相引用的代码时,“垃圾收集”程序就会发现它们并将它们终止。这一点在COM中是不可能做到的,因此它们将在内存中永远存在。“垃圾收集”还有另外一个潜在的性能优点:在对象被取消引用的时候不用花很多的精力在终止对象上;利用了“垃圾收集”,这个终止处理过程是在应用程序处于空闲状态时发生的,所以它减轻了对用户的影响。但是,“垃圾收集”也会发生在应用程序处在运行装载的时候,这时系统将会运行在较低的系统资源下。

另外,可以通过编写代码来手动触发“垃圾收集”处理程序:

System.GC.Collect()

以上这个处理过程要花一些时间,但是在想终止对象的时候也不必每次都执行这个处理过程。最好是这样来设计我们的应用程序:在最后终止对象的时候才将对象从内存中清除。

Finalize方法:

这个“垃圾收集”机制提供了一些功能,这些功能可以跟VB6.0中的Class_Terminate事件相媲美。当对象被终止的时候,“垃圾收集”处理的代码将调用Finalize方法,它就像Class_Terminate一样可以进行一些最后的内存清理工作。

Protected Overrides Sub Finalize()

(此处可以进行一些内存清理工作)

End Sub

以上的这些代码可以使用Protected(保护)作用域,也可以使用重载关键字。这里值得指出的是,这种方法是在对象被“垃圾收集”机制终止之前被调用的,所以它跟Class_Terminate事件是很相似的。

但是,还需要记得这种方法可以在对象被取消引用后被调用,它是通过最后一段客户代码来实现的。

实现Dispose方法:

在有些场合中,Finalize方法是不可接受的。如果有一个对象,它使用一些非常有限的宝贵的系统资源,比如数据库连接、文件处理或者系统锁住等。这时候就需要确保系统资源在对象被取消引用的时候被释放。为了实现这个目的,可以执行这样一种方法,它可以被客户代码调用,来强迫对象被清除并且释放系统资源。虽然这不是一个完美的解决方案,但是它确实是很有效的。习惯上,这个方法就取名为Dispose,其代码如下:

Public Sub Dispose()

(此处可以进行一些清除工作)

End Sub

在必要的时候,可以调用这个方法来确保内存清除工作的进行。

6.如何使用访问类型

在很多情况下,都会将编写好的类提供给别人,供他们使用它提供的功能。例如,他们可以调用类的一个方法或者访问其中的一个域。面向对象编程的一个最大的好处是开发人员可以方便地控制对类成员的访问,这意味着可以完全控制想让别人使用的部分。可以使一个方法可以被别的开发人员使用,也可以使一个类成员只能在该类中被访问。

在VB.NET中,访问是分等级的。下面我们来讨论这些等级。

①Public:Public类成员没有访问限制。在一个类成员前面添加Public关键字就使得它可以被随意访问。例如,Person类中的PrintSalary方法就是一个public方法,可以从任何地方对它进行访问。

②Private:秘密的类成员只能被该类内部的其他成员访问。使用Private关键字就可以使一个类成员成为秘密的。

③Protected:被保护的类成员只能被该类的派生类和该类本身内部进行访问。使用Protected关键字就可以使类成员成为被保护的类成员。

④Friend:具有friend级访问限制的类成员只能在定义该类的程序内部使用,使用Friend关键字就能使类成员具有friend级访问限制。

⑤Protectedfriend:这是protected和friend两种访问类型的组合。这些不同的访问类型使面向对象编程具有了信息隐藏能力。也就是说,可以使用这些访问类型来保护不愿意让别人访问的信息。

7.如何使用静态成员

再来看看Person类,也许读者会对我们没有将System.Console类实例化就使用它的Write方法有点不理解,为什么可以这样做呢?因为在面向对象编程语言中,有一种被称作静态成员的特殊的类成员VB.NET,也有静态成员这一概念。无须对一个对象实例化就可以使用其中的静态成员。例如,下面的代码列表中,SalaryLevel类中就只包含有静态的域。

类中的静态成员:

Class SalaryLevel

Public Shared Level1 As integer=1

Public Shared Level2 As integer=2

Public Shared Level3 As integer=3

Public Shared Level4 As integer=4

Public Shared Level5 As integer=5

End Class

可以这样使用此类:

Class Person

Dim yearlyBonus As integer=10

Public Sub PrintSalary()

’使用SalaryLevel类的静态域向Console输出工资额

Console.Write(SalaryLevel.Level4)

End Sub

Public Shared Sub Main()

Dim person As Person

person=New Person()

person.PrintSalary()

End Sub

End Class

在Person类的PrintSalary方法中,可以在不首先创建SalaryLevel类变量的情况下使用其中的静态域Level4。不属于静态成员的类成员被称作实例成员。

静态类:在类的前面加上Shared关键字可以使这个类变成一个静态类,静态类无须进行实例化就可以使用它里面的方法和变量。

8.如何使用全局变量

对于共享变量,另外一个通常的应用是提供了全局变量的类型。给定一个Public作用域的共享变量:

Public Class TheClass

Public Shared MyGlobal As Integer

End Class

我们可以在客户代码中使用这个变量。

TheClass.MyGlobal+=5

这个变量在我们应用程序的任何地方都是有效的,它提供了一个很好的机制在组件、类、模块等之间来共享数值。

6.3.5如何进行继承

当通过继承来创建一个子类的时候,新类就可以从父类中得到所有的Public(公共)和Friend(友好)方法、属性和变量。如果你在父类中声明一个Private(私有)的方法、属性和变量,那么在新的子类中就不能得到父类中这个私有的方法、属性和变量。当然也有个例外,就是New方法。构造函数方法必须在每一个子类中重新编写。继承是扩展类的一种特性。如果需要完成一些功能,当然可以创建一个新类,但如果别人所创建的类可以提供一部分用户所需要的功能,就可以创建一个扩充了原有类的新类。创建的类可以称为子类或派生类,原来的类可以被称为父类或基类。在VB.NET中,一个类只能继承一个父类,多类继承在VB.NET中是不允许的。在类名后加一个冒号,后面再加上关键字Inherits和父类的名字就可以完成对类的继承。例如,下面的代码就通过扩充Person类创建了一个被称为Employee的新类:

扩充类:

Imports System

Class Person

Dim salary As integer=10

Dim yearlyBonus As integer=10

Public Sub PrintSalary()

Console.Write(salary)

End Sub

End Class

Class Employee: Inherits Person

End Class

现在,就可以初始化一个Employee对象,并使用Person中的成员。如下面的代码所示:

初始化Employee对象

Class Person

Public salary As integer=10

Public yearlyBonus As integer=10

Public Sub PrintSalary()

Console.Write(salary)

End Sub

End Class

Class Employee: Inherits Person

End Class

Module Module1

Public Sub Main()

Dim employee As Employee

employee=New Employee()

employee.PrintSalary()

End Sub

End Module

下面代码演示了如何通过编写一个新的PrintBonus方法来扩充Employee类别的方法。

在子类中添加新的方法:

Class Employee: Inherits Person

Public Sub PrintBonus()

Console.Write(yearlyBonus)

End Sub

End Class

必须注意成员可访问性限制的使用。例如,如果使yearlyBonus域具有private属性,就不能被Employee类访问。继承是面向对象编程中常用的方法。实际上,.NET Framework类库中就有许多由继承其他类得到的类。例如,Windows.Forms名字空间中的Button类就是ButtonBase类的一个子类,而ButtonBase类本身又是Control类的一个子类。

所有的类最终都是System.Object类的子类,在.NET Framework类库中,System.Object类被称为根或超级类。

下面ClassThree就是不可继承的类:

NotInheritable Class ClassThree

End Class

如果扩充这个类就会引起编译错误。为什么要使类不可继承呢?一个原因是不希望别人扩充我们的类,另一个原因是不可扩充的类产生的代码运行速度更快。尽管这样,还是应该小心地使用不可继承的类,因为它不符合面向对象编程的初衷,只有在100%地肯定不扩充这个类时,才能使它不可继承。在有些面向对象编程语言中,这些类也被称作最终的类。

如果想让子类中继承父类的方法改变,可以先声明父类的方法是Overidable。然后在子类中用关键字Override把此方法进行重写。在类或控件的继承中,子类或子控件封装了父类的所有函数,其中包括事件处理程序。

如何使用事件:

Public Class EventSource’声明一个事件

Public Event LogonCompleted(ByVal UserName As String)

Sub CauseEvent()’激发事件

RaiseEvent LogonCompleted(”AustinSteele”)

End Sub

End Class

引发事件的类是事件源,而处理事件的方法是事件处理程序。事件源对它生成的事件可以具有多个处理程序。当类引发事件时,将在每一个被选择用来处理该对象实例的事件的类上引发该事件。

同类推荐
  • 中文版AutoCAD2005建筑绘图精讲精学

    中文版AutoCAD2005建筑绘图精讲精学

    本书从中文版AutoCAD2005建筑绘图的基础进行介绍,讲解了建筑绘图的环境设置、二维建筑图形的绘制、二维建筑及装饰图形的编辑、建筑绘图中的文字标注和图形查询、建筑装潢平面图中的尺寸标注、建筑绘图中图块的应用、建筑平面图的绘制、建筑立面图的绘制、建筑剖面图的绘制、建筑绘图中的三维造型、三维建筑模型绘制及建筑图纸的布局与打印输出等内容。
  • 办公软件高级应用

    办公软件高级应用

    日新月异的信息技术使计算机的应用渗透到各行各业,融入到我们的工作、学习和生活中,特别是在办公领域中运用计算机技术,可以实现办公自动化,成倍地提高工作效率。在众多的办公软件中,微软公司的Office系列软件是办公自动化软件中的佼佼者,其强大的功能深受全世界广大用户的青睐。根据当前业界的需求以及办公软件的实际应用范围,本书针对Office2003系列产品,深入讲解其高级应用知识和操作技能。
  • 悟道:一位IT高管20年的职场心经

    悟道:一位IT高管20年的职场心经

    本书是一位有20多年职场经验的IT企业高管撰写的一系列有关职场悟道的短文集成,讲述的是在企业里如何修炼自己,如何摆平自己的心态,怎样做到“世事洞明”和“人情练达”,如何“搞定老板”,怎样做到工作和生活平衡等诸多话题,涉及到跳槽、转行、升迁、环境、沟通、老板、下属、老外等等。每一篇都以作者的亲身经历或者身边的故事说明道理,语言简洁流畅,妙趣横生,更有不少经典片段和发人深省的职场警句,读起来就像是一个睿智幽默的老朋友坐在你面前娓娓道来。
  • 初级会计电算化

    初级会计电算化

    本书是作者根据历年会计从业资格考试的考试大纲以及多年对真题的分析,并结合多为专家、学者的实践经验而编写的。本书主要分为八套模拟试卷,以对考生考前的学习进行模拟实战,达到提高考生成绩的目的。
热门推荐
  • 另一个我是神仙

    另一个我是神仙

    另一个我,曾教伏羲画八卦,刑天断人头,后裔射烈日,嫦娥奔明月……现在的我,给少爷做伴童,在谷店当伙计,做过挑夫,干过渔夫……另一个我,曾将“魔祖帝鸿”打入轮回,“仙祖鸿钧”废了修行,“妖祖鲲鹏”幻化成鼠……现在的我,出生时被人丢弃,长大后被人厌弃,还不时自暴自弃……另一个我,曾是神仙!不在七界中,天地任我游,不死不灭……现在的我,是个傻儿!一个胆小如鼠之人、一个蝼蚁贪生之徒,却被逼迫拯救万生,辟地开天,鸿蒙创世……
  • 新股民炒股必备的10大兵器

    新股民炒股必备的10大兵器

    本书共分为10章,每章介绍一种技术指标,包括K线图、均线、成交量、PSY指标、MACD指标、KDJ指标、OBV指标、RSI指标、BOLL指标和DMI指标。每章内容又分为三部分:某项技术指标的原理和意义,该指标买入信号及实战案例,该指标卖出信号及实战案例。读者既可以按照本书编写顺序阅读,也可以根据自己的兴趣或经验进行选择性阅读。
  • 苏君的青春日常物语

    苏君的青春日常物语

    在顺安高中有着一位名叫苏夏的高中生,目前高二,没有朋友,没有交际圈,寡言少语,平平凡凡,普普通通。苏夏的世界永远都是一个样,无论发生了什么。苏夏本以为这样的情况会一直持续,直到抵达生命的终点。但一切,都在那个中午改变了。“喂,做我男朋友吧?”那个女孩趴在苏夏的面前,如此说道。“我拒绝。”这就是苏夏的回答,然而,这只不过是故事的开始罢了。
  • 情留马鞍山

    情留马鞍山

    1970.4一群热血青11山下乡的故事。
  • 刘思怡修仙记

    刘思怡修仙记

    一名女高中生毕业后在一家服装厂工作,正好遇上五一劳动节,厂长带着全体员工去旅游,唯独留下,女主一人在宿舍。还有一名50多岁的门卫“老王”看守厂房。女大学生洗头发之时被老王突然冲进去欲对她行不轨之事,当老王抱住刘思怡欲对其行不轨之事却被刘思怡推了一下,脚下踩到滑丝的地板,身体往后倒去,正好磕破后脑勺,因此丧命。女大学生慌忙之下跑出去,遇到一名算命先生用自身阳寿为她修改命运,从此女大学生踏上仙途,应出一名协修不敌被一名男修士救助,后来才知道那名男修竟然是一名结丹高手,两人一同结伴除魔味道,最终成为伴侣。遇到敌不过的邪修跑回家里,“夫君我被人欺负了”。“是谁竟敢欺负我的老婆,看老公我去替你出气。
  • 七根凶简(1)

    七根凶简(1)

    上古之时,有恶念七则,具有蛊惑人心的力量,凡接触之人,总会心性突变,犯下不赦命案。老子决意为当世除一大害,引龟甲兽骨中的七道不祥之气于七根木简,以凤凰鸾扣扣封,终将凶简封印。但谁料想,有一天凶简会重现人间。
  • 天波杨府

    天波杨府

    你什么时候修的这个。怎么了。这不是曼陀罗花吗。怕了。你小时候不是这样。赵飞啊,不就是有个纹身吗。这绣的图案这种花,是欺诈。
  • 绝色毒妃:邪帝狠宠妻

    绝色毒妃:邪帝狠宠妻

    什么?堂堂金牌特工居然穿越了,还穿越成任人碾压的渣渣,且看废材如何逆转成命运。月色盎然,窗前一绝色女子冷笑道“今日辱我者,他日肯定百倍奉还”“今日欺我者,他日我让他生不如死!"倾心阁中'’娘子,快告诉我,今天送你回来那货是谁"一个无良的妖孽眨着闪烁的眼睛逼问着,语气带着丝丝危险气息。"和你有关吗?"某女子答到"既然,娘子说和我无关,那好吧。。。""辰风,去把那人给我杀了"某风傻眼,浓浓的一股醋意,在眼前飘过。且看男主如何俘获女主心。【男强+女强+腹黑+宠文】
  • 爆宠辣妃:至尊地主婆

    爆宠辣妃:至尊地主婆

    玉苏想:一大家子的黄毛丫头无男丁,爷爷奶奶掌大权又不喜她们五姐妹,她想可不可以把家给分了。玉苏想:有这好厨艺好医术,怎么也不能饿着自己吧,只是当朝王爷要自己为贴身厨娘,要自己给他调养中风后遗症的身子,可最后居然要让自己当他的王妃,看着那露出腹黑本貌的男人,还要自己履行夫妻义务男人,她想世上有没有后悔药吃。玉苏想:她有高贵的身份跟富裕的身家,极品亲戚找上门,她悠闲的喝着杯中茶。她想可不可以关门放狗。他以为她只是一只温柔的小猫咪,看着渐渐露出锋利爪子的狐狸,他想他可不可以退货,只是某只小狐狸挺着圆滚滚的肚子,挥舞了手中的一枚绣花针笑道“晚了。”
  • 动漫宇宙大乱斗

    动漫宇宙大乱斗

    因为一个人的乱入海贼王世界,搞得整个世界变得扑朔离奇了起来,月球的背后是另一个世界,整片星海也要征服,这才是真正的海贼王。