登陆注册
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代码只是使这些操作得以开始的前端而已。

同类推荐
  • 体感交互技术

    体感交互技术

    本书提出了体感计算的研究,探讨了基于体验性认知的个性化电子学习方式,并且分析了面向儿童的艺术创造体验,在体感虚拟化身的帮助下,用户可以通过身体运动,促进情感心智的全面发展,
  • 中文版3dsMax2010实例与操作

    中文版3dsMax2010实例与操作

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

    中文版AutoCAD2005辅助设计宝典

    本书全面、详细地介绍了中文版AutoCAD2005的特点、功能以及使用方法和技巧。全书共分11章,前九章分别介绍了利用中文版AutoCAD2005进行辅助设计的方法和技巧,最后两章讲解了若干综合实例。
  • 高校校园网管理与网上引导工作研究

    高校校园网管理与网上引导工作研究

    在当今的信息化潮流之下,我们不可否认互联网的出现,绝不仅仅是传送手段的变化,更重要的是它代表着一种新的社会形态——网络社会的来临。互联网已经以一种前所未有的方式渗透到现代社会的各个层面和领域,成为现代社会前进和发展的动力和工具,它推动了社会经济、文化政治实现所谓的“数字化转变”。
  • 如何组装电脑

    如何组装电脑

    本书以问答的形式介绍了组装电脑的基本知识。内容包括:电脑硬件的部件组成、CPU的发展历程、CPU主频、内存的组成、内存的主要性能参数等。
热门推荐
  • 我不爱这个世界了

    我不爱这个世界了

    如果人生重来一次,我想选择这个世界没有出现过我这个人“这……个世界…不…值得我…去……爱”少年躺着血泊中,回想这个世界仅剩的美好,可是捕捉脑内的回忆,哪有什么美好“言旭,如果人生可以重来,我保护你好吗?”少年也曾背负着满天星辰站在神坛上,享受着唯一的美好,可是一次次的舆论,一次次的背叛,缺又回到了起点的那个他这一次,他不在是一个人了啊!真的是好可笑啊!愚蠢至极到相信他啊!病态的爱又能换来什么啊……到最后还是伤痕慢慢啊恢复了记忆的他,又会如何抉择
  • 我在末世里生活

    我在末世里生活

    不管是在任何情况下,始终能够保持着人性,即使是家人的背叛,末世的残酷,仍旧还鼓起勇气面对未来,你,能做到吗?
  • 神兽家族

    神兽家族

    一个神奇的大陆,拥有着四种神兽,他们负责保护这个世界的安宁,保护所有普通人的生活。战斗平静而残酷,一个个修炼者崛起,却也有一个个修炼者陨落,残酷而美好。一切,都凭实力说话,实力代表一切。轩辕天火从无名小卒,最后掌控了这个世界,这里到底拥有什么秘密。
  • 美男谱:不帅咱不要

    美男谱:不帅咱不要

    小白女意外获得美男系统,从此走上幸福的修仙之旅。
  • 英雄联盟之王者争霸

    英雄联盟之王者争霸

    大学生王麟在帮胡凯在LOL上教育了小号美眉金颜之后从此自己的生活轨迹出现了分叉。高校联赛!百城争霸!职业联赛!世界电子竞技大赛!竞技从梦想出发!此书承诺绝不TJ保证完本!请大家放心看。欢迎多提意见与建议,莫悔虚心接受。在此先谢过!!(想看王麟如何从一个菜鸟如何变成顶尖的职业玩家,就从这里开始)意见Q群:176835975亲。求关注哦!!!!
  • 战术江湖

    战术江湖

    男厕所门后突然伸出一只血淋淋的手,到底是丧尸还是鬼魅,刘洪波心里噗通噗通。兜里的一块小石子里冒出一股白烟,袅袅娜娜竟然幻化成了一个日本少女,鬼子的式神跟了我了?地藏王菩萨的坐骑怎么能是一条狗呢?还是韩国的,这真叫人郁闷。丧尸,鬼魅,怪兽,地缚灵,式神;幻阵,禁阵,警阵,净阵,净魂阵,天呐,怎么这么多的阵?好东西都给我点儿呗,你们都是名门之后,不匀我点儿好东西,我以后可怎么在界里混?
  • 归来觉醒时代

    归来觉醒时代

    三百年后,天尊易凡为了保护地球而战死,居然重生到地球灵气复苏之前的年代,为了保护自己的朋友、爱人,为了保护地球,他决定在灵气复苏之前提前准备,这一世,他要不留遗憾。
  • 天行

    天行

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

    洛少,强势锁婚

    见过死了后,还给自己查死因的吗?上天给了她重生一次的机会,她决定揪出这个凶手,明明白白活一回。只是为么,前世最不待见她的摆设老公,突然就开始关心她了?有人要害她,才揪住点小尾巴,他就把对方连根拔起。有人要羞辱她,刚开口,就被他怼回去,外加让对方混不下去。有人要亲她……“先生,麻烦让让,这是我老婆。“林浅彻底怒了,“洛文漠,到底要怎样。““你想对我怎样就怎样。”我是你的。““……”有人却说,真正想杀她的,其实是他……他拔出小刀按在自己脖子上。“你若认定是我,命你拿去。如果不拿,我帮你一起查出真凶!”
  • 司马家的三国

    司马家的三国

    见证汉唐之威,回顾元清之狼狈。我和她,你和他。携手共铸天上朝!民心悦,天下平!美哉——手持三千甲兵无畏,纵然万敌也无惧。汉之鹿,一出世!天下英雄共逐之!我便是,其中的,一人——!(以上正经版,以下滑稽版。)古人果真不傻!我得叫人弄点特大号蒙汗药给他们当饭吃……