书城计算机网络综合应用软件设计
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代码只是使这些操作得以开始的前端而已。