登陆注册
8724600000025

第25章 软件构造(4)

6.3.6如何使用接口

VB.NET允许创建有多个接口的工程。可以使用Implements关键字来实现。在类要执行一个新接口的时候,需要编写代码来执行接口上的每一个方法。当继承提供了一个完美的变化后,可能还想在我们的对象中执行多个接口。VB.NET保存了Implements关键字。

(1)接口声明

最直观的改进是引入了一个用于声明接口的正式语法,它是使用了Interface关键字的:

Public Interface My Interface

Event My Event()

Sub My Method()

Function My Function(ByVal Param1 As Integer)As Integer

Property My Property()As String

End Interface

(2)执行接口

执行一个接口是通过使用Implements关键字来实现的:

Public Class The Class

Implements My Interface

End Class

可以在类中简单地标记一个方法,作为接口中的特殊方法来执行:

Public Sub My Method()Implements My Interface.My Method

这样为了执行本例子的接口,必须编写以下代码:

Public Class The Class

Implements My Interface

Public Event My Event()Implements My Interface.My Event

Public Function My Function(ByVal Param1 As Integer)_

As System.Integer Implements OOlib.My Interface.My Function

End Function

Public Sub My Method()Implements OOlib.My Interface.My Method

End SubPublic Property My Property()As String Implements OOlib.My Interface.My Property

Get

End Get

Set

End Set

End Property

End Class

(3)执行多个接口

一个类中可以有多个执行语句,即执行多个接口。例子如下:

Public Interface My Interface

Sub DoSomething()

End Interface

Public Interface OtherInterface

Sub DoWork()

End Interface

可以构造一个类来执行两个接口,代码如下:

Public Class TheClass

Implements My Interface

Implements OtherInterface

End Class

接下来的例子,可以执行DoSomething方法也可以执行DoWork方法:

Private Sub DoSomething()Implements My Interface.DoSomething

(此处是执行的代码)

End Sub

Private Overloads Sub Do Work()Implements Other Interface.Do Work

(此处是执行的代码)

End Sub

或者,如果以上两种方法是做同样的事情,可以利用一个方法来执行两个方法:

Private Sub Do Something()Implements My Interface.Do Something,Other Interface.Do Work

(此处是执行的代码)

End Sub

由上面的例子可以看出,可以在Implements关键字后用逗号分隔的列表类组合一系列的执行方法。

6.3.7早的和晚的捆绑的使用

所谓早的捆绑,意思是说代码在直接处理对象时提前知道数据类型并且可以更有效地处理对象。早的捆绑允许IDE使用IntelliSense来提供开发效率,以及允许编译程序确保引用的方法存在并且提供正确的参数数值。晚的捆绑的意思是代码动态地处理对象。这提供了更大的灵活性,因为代码没有考虑对象的类型,并且只要对象支持用户想要调用的方法,它就被处理。并且因为IDE或者编译程序不能识别对象的类型,而且没有IntelliSense和编译过程的语法检查,所以它将带来一些预想不到的灵活性。VB.NET继承了这个传统,并且它在处理对象的时候提供了对早的和晚的捆绑的支持。

默认状态下,所有的对象是早的捆绑。只要OptionStrict被设置为On,IDE和编译器强迫这样做,On也是默认的。但是,如果OptionStrict被设置为Off,在整个代码中就使用晚的捆绑。

(1)对象类型的使用

晚的捆绑发生在编译器不能判断对象类型的时候。这个问题可以通过使用对象的数据类型来解决。一个数据类型对象的变量可以保留任何的数值,包括任何类型对象的引用。这样,如同下面的代码就可以在任何对象中运行以完成一个My Method方法,这个方法没有任何参数。

Option Strict Off

Module Late Bind

Public Sub Do Something(obj As Object)

obj.My Method()

End Sub

End Module

如果对象传递这个程序(没有一个无参数的My Method方法),那么就会出现一个错误。使用晚的捆绑的代码要总是提供错误捕获:

Option Strict Off

Module Late Bind

Public Sub Do Something(obj As Object)

Try

obj.My Method()

Catch

(这里可以进行一些适当的处理来给出调用这种方法的错误)

End Try

End Sub

End Module

虽然晚的捆绑比较灵活,但它容易导致错误并且比早的捆绑更慢。为了产生晚的捆绑方法的调用,.NET程序必须动态地判断目标程序是否由一个方法来匹配调用的方法,并且它必须调用那个方法。这会比早的捆绑花更多的时间,因为早的捆绑能够提早知道方法的存在并且编译代码,从而使得调用变得很直接。

(2)CType函数的使用

使用对象数据类型来传递对象引用并在需要处理它们的时候将它们转换为适当的类型是十分有用的。这一切可以通过使用CType函数来实现,它允许使用类型对象的变量来使用早的捆绑方法调用:

Module Late Bind

Public Sub Do Something(obj As Object)

CType(obj,The Class).MyMethod()

End Sub

End Module

使用CType方法来暂时将变量转换为一个特殊的类型而不管TheClass的类型。CType函数是很有用的,特别是处理对象来执行多个接口的时候,因为可以引用一个对象变量并且它可以转换为适当的类型。举个例子,如果有一个类型的对象TheClass,这个对象执行MyInterface,那么可以这样来编写代码:

Dim obj As The Class

obj=New The Class

CType(obj,My Interface).Do Something()

6.3.8如何使用交叉语言的继承

可以在一种编程语言上创建一个类,然后应用到另外的编程语言中,当然也包括继承。实际上,现在有许多程序涉及人员已经在应用这个技术了。许多的.NET系统类库是在C上编写的,而在VB.NET上编写程序的时候,可以继承这些类作为父类。

创建VB.NET父类:举个例子,可以在VB.NET下创建一个类库工程,取名为vblib,并且增加一个简单的类为Parent,代码如下:

Public Class Parent

Public Sub Do Something()

MsgBox(Parent Do Something,Msg Box Style.Information,Parent)

End Sub

End Class

可以利用这个父类在C上创建一个子类。

创建C子类:可以增加一个新类库工程,具体做法是使用菜单File(文件)→AddProject(增加工程)并将它命名为cslib。接着通过选择菜单Project(工程)→AddReference(增加引用)来增加一个引用到vblib工程。当在IDE中直接引用这个工程的时候,不需要VB.NET的源代码。相反的,可以先创建vblib工程,再创建一个组件,接着从C工程中引用这个组件以达到访问父类的目的,代码如下:

namespace cslib{

using System.WinForms;

using vblib;

public class csclass:Parent{

public csclass(){

Messagebox.Show(csclass constructor);

}

}

}

以上这个C代码共享了VB.NET中的代码。代码的第一行是为文件定义了名称空间(namespace)。在C中所有的名称空间是显式定义在每一个代码模块中的:

namespace cslib

在C中的Using关键字等价于在VB.NET中的Imports关键字。因为要使用System.WinForms和来自vblib的名称空间,所以使用以下的语句来引入这些名称空间:

using System.WinForms;

using vblib;

代码接下去的一行声明要创建的类及表明这个类是Parent的一个子类:

public class csclass: Parent

在C中一个子类是通过定义一个类来定义的,具体语法是类名之后加冒号(:),然后再加父类。这条语句等价于如下VB.NET的代码:

Public Class csclass

Inherits Parent

在VB.NET中构造函数是通过使用保留的方法New来创建的。而在C中构造函数是使用类名作为方法的名字来创建的,例如:

public csclass(){

Messagebox.Show(csclass constructor);

}

在C中,大括号({和})定义一个块结构,而在这个块结构中可以放置方法的代码。在这个例子中的方法很简单,只是显示一个对话框来指示构造函数被调用了而已。至此就可以为新工程创建客户代码了。

创建客户应用程序:

首先可以使用菜单File(文件)→AddProject(增加工程)来增加一个新的VB.NET的Windows应用程序工程。在这个新工程可以选择菜单项Project(工程)→AddReference(增加引用)来为cslib工程增加一个引用。在工程中单击鼠标右键,并从弹出的菜单中选择SetAsStartupProject选项,这样做的目的是当你按下F5快捷键时工程就可运行。这里值得注意的是,vblib工程没有任何的引用,这是因为没有直接使用来自组件的任何代码。所有的客户应用程序所关心的是cslib工程。当在IDE中直接引用cslib工程的时候,不需要C代码。相反的,可以先创建cslib工程,再创建一个组件,接着引用来自客户工程的组件以访问测试的C子类。接着还要增加一个按钮到窗体中,并为该按钮编写以下的代码:

Protected Sub Button1_Click(ByVal sender As Object_ByVal e As System.EventArgs)Dim obj As New cslib.csclass()

obj.Do Something()

End Sub

虽然创建一个VB.NET的子类也没什么差别,但是在本例子中是使用了不同的编程语言来实现的。其中的差别大家应仔细体会,相信会对你有所帮助。当运行应用程序并单击按钮的时候,就可以看到一个对话框,对话框上面显示了我们所调用的csclass的构造函数;另外一个对话框上显示了所调用的VB.NET父类的DoSomething方法。总之,面向对象技术的要点,就是把问题抽象成各个对象并封装它们。

6.4ADO.NET

每一个优秀的应用程序背后都有一个数据库管理器的支持,尤其是编写通过Internet来提供服务的Web应用程序的时候。像Amazon、eBay,其实就是向终端用户提供服务的大型数据库前端。编程实际上就是管理和操作数据。而UI代码只是使这些操作得以开始的前端而已。

同类推荐
  • 信息技术教育大全-计算机网络

    信息技术教育大全-计算机网络

    信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络
  • 公开时刻

    公开时刻

    本书从传播者分析,内容分析,媒介分析受众与效果分析,传播环境与传播控制分析等几大方面把汶川地震作为重大传播案例,阐释汶川地震的传播学遗产。对政府部门和新闻媒体在危机公关方面做出正面评价。
  • 创业在微软

    创业在微软

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

    黑客就在你身边

    互联网络正在改变着我们的生活,每个人都处在互联网的天罗地网之中。本书以轻松的笔调,向人们介绍了有关“黑客”的知识。当你读完这本书后,你会发觉“黑客”一点都不神秘,他们渴望全社会对他们有一个公正的评价。
  • 纵横于天地之间——互联网络技术

    纵横于天地之间——互联网络技术

    本书告诉你:不管你是谁,只要生活在当前的时代,你一定知道电话,知道电脑,知道上网……知道许许多多关于电子、关于计算机、关于网络的话题,这就是网络时代。网络的话题可多了:它是怎么来的?什么是“蜘蛛网”?网络的过去和现在,上网的方法,如何使用网络,互联网的安全,网络有“陷阱”吗?网络有“瘾”吗?网络文化和未来又是怎样的?到书中去找答案吧!
热门推荐
  • 我的万能屋

    我的万能屋

    一屋在手,天下我有。你觉得可能么?呵呵,这尼玛是个什么坑货万能屋!拿走拿走,老子不稀罕。必须要完成998个任务才能解除绑定!!!靠,且看机智青年如何玩转异界~
  • 仙途漫长

    仙途漫长

    "不管前路有多远,既然走上这条路,我就要一步一步登上绝顶!〃
  • 九天神官

    九天神官

    “我要用自己的力量,去换回我曾经爱过的人,不管你是谁!我也要这么做!”生命从头再来,开始了从未接触过的能量修炼,看炎夜如何在新的世界中逐渐变强,成为一代神官,继续保护和拯救他爱过的人。
  • 末日归路

    末日归路

    末日来临,毫无征兆,为了见到心中至亲,踏上生死归路!
  • 最恶咒梦师

    最恶咒梦师

    叶新重生未来,通过系统,进入梦境执行任务。上帝的七把钥匙出世,血族、妖族、梦魇各大种族蠢蠢欲动。光明、黑暗两大星梦师派系的百年战争,生生不息。密室逃脱、狼人杀、追凶查案、荒岛游戏、猎杀妖魔等各种梦境应有尽有。恶梦一直存在,神秘从未远离。
  • 默默难测:群主小淡定

    默默难测:群主小淡定

    玉千淳看似安详的靠在园中垂丝海棠旁,安静的姿态却在掩饰轻度泛白的脸颊。锁住的眉头,浮现的点滴波光展示着女子此刻的不平静。一声近乎呢喃的声音散在空中,被晚风吹向他方,竖起耳朵,缓缓听到何苦啊?你来了啊,她抬起低下的头看着面前锦绣蓝衣的人,紧咬住的下唇费力的展开笑容,苍白而无力。那样一撇,却让人忍不住的叹息。
  • 天行

    天行

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

    天行

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

    学院超级召唤师

    一个少年,意外的不能在意外的获得了一个系统,这将改变少年的命运,美女神马的,警花,校花,护士。。。纷纷涌入怀中。什么?听说你不服?那好吧,不服就不服,什么,你要揍我,那你先打过我的宠物,再来吧,九尾狐,狮鹫,三头地狱犬。。。。你随便挑,看看能打过那个?
  • 诡异神探

    诡异神探

    每个城市都有一群另类的维护者,他们的职责是解密,更是保密,本书将带领你们进入一个灵异的世界,这里他们将面对灵异与亡灵,不断迎接新的挑战!