OOp(Object-Oriented-Programming)是相对于结构化程序设计(Structure Programming)而言的,表示采用面向对象的思想进行软件的编制。它是当今最流行的编程模式。“面向对象技术”追求的是软件系统对现实世界的直接模拟,尽量实现将现实世界中的事物直接映射到软件系统的解空间。
对象是一些把属性(Properties)、字段(fileds)、方法(methods)、事件(event)作为一个单独的数据类型进行处理的实体。编程还需要对象满足和支持下面三个特性:封装性、继承性和多态性。对象可以使用户只需首先声明一些变量和方法以后,就可以在需要使用的时候,调用一个它的对象进行重用。
在Visual Basic的早期版本中(1.0-3.0)并没有包括面向对象的功能,从vb 4.0开始,用户可以象建立一个新的窗体那样建立一个新的类,并把它作为一个新的对象,类在Vb.net中是一个非常重要的部分,几乎所有正规的程序都包括了一个或者几个类,在vb.net中,类模块和窗体的区别已经不存在了,几乎所有的程序都是由类组成的,为了更好的使用这些类,它们被按照不同的功能分中不同的功能类库里。
vb.net在声明、构造以及执行类上比vb 6.0有很大的变化,同样在对象的处理上也有不小的改变。这些改变影响了定义一个对象、引用和取消引用对象以及使用捆绑技术的方法。
vb.net没有使用CreateObject语句来创建对象。CreateObject是Visual Basic与COM密切相关的一个产物。因为vb.net不再使用COM,所以从Vb.net开始就不再使用CreateObject。vb.net使用New语句来创建对象。用户可以在代码的任何地方使用New。下面就是一个创建一个变量并且在类的一个实例中创建一个对象的实例:
Dim obj As TheClass
obj=New TheClass()
可以简化上面的语句:
Dim obj As New TheClass()
在Visual Basic 6.0中,以上的两段语句会存在一些问题,但是在vb.net中上瑞的两段语句之间没有区别,只是第二段语句缩短了而已。如果用户在一个模块中声明一个变量,那个变量就只有在该模块中才有效。在许多情况下,用户想在方法的作用域中声明一个变量,或者想在模块(比如Try...End或者loop循环结构)中创建一个类的实例。在这样的情况下,用实例化来组合声明有些不妥。
上面的语句为用户定义了一个变量并实例化了一个类。这条语句可能在处理继承或者多个界面的时候会更有用。用户可以声明变量为其中一种类型并且基于要执行界面的类来实例化对象:
Dim obj As MyInterface=New Theclass()
也可以同时利用复杂的语句。假如现在有个需要对象引用的方法,就可以这样来实例化对象:
DoSomething(New TheClass())
以上的语句是调用DoSomething方法并且传递Theclass的一个新的实例作为参数。这个新的对象就只有存在于这个方法的调用事件内,即当方法完成之后,这个对象就自动被取消引用。
这里还得注意一下,取消引用一个对象不是意味着马上终止这个对象。这一点前面的介绍中有过解释。对象只有在.NEt的垃圾收集处理程序的时候才将它们从内存清除掉。
下面的例子可能更复杂。不是利用一个对象引用,这里的方法需要一个字符串。用户可以从一个方法提供一个字符串数值到对象中来实例化对象并调用方法:
DoSomething(New TheClass().GetStringData())
很显然,用户可能需要仔细观察一下这条语句的可读性。语句的压缩往往降低了可读性,这一点是应该注意到的。
当处理对象的时候,这里没有使用Set语句。在vb 6.0中,处理对象引用的时候,用户不得不使用Set命令处理来自其他数据类型的对象。而在vb.net中来自其他数据类型的对象是采用不同的方法来处理的,这里可以使用直接的参数来处理对象,就象处理整型或者字符型数据类型。这个Set命令在Vb.net中不再有效。
在vb 6.0中,用户可以通过设置对象引用为Nothing(空)来取消引用对象。这点和vb.net中的处理方法是一样的。
Dim obj As TheClass
obj=New TheClass()
obj=Nothing
但是在vb.net中这条语句有不同的效果。因为vb.net不是使用引用计算来终止对象,而是依靠垃圾收集机理。而在vb 6.0中,当没有变量访问对象的引用,这个对象就被终止。在vb.net中,以下这样看法是错误的:当垃圾收集处理程序发现对象没有被引用它就被终止。正确的应该是,是最后一个引用被移除之后的一段时间后才将对象从内存中清除。但是这并没有清除被取消对象的数值。如果用户有一个长时间运行的算法,那么最好在处理程序中显示式地取消引用这个对象,这样就可以在可能的情况下由垃圾收集程序清除它们。只要代码保留了对象的引用,那么对象就会保持在内存中而不会被垃圾收集程序清除。
vb.net可以创建处理代码,这些处理代码是运行在.NET框架上的。所有的管理代码可以和其他类型的处理代码交互作用,而不管用户是用什么编程语言来创建这些组件的。这就意味着用户可以在一种编程语言上创建一个类,然后应用到另外的编程语言中,当然也包括继承。这正是交叉语言混继承的混合编程机理。实际上,现在有许多程序设计人员已经在应用这个技术了。许多的.NEt系统类库是在C#上编写的,而用户在vb.net上编写程序的时候,可以继承这些类作为基类。
举个例子,在vb.net创建一个类库工程取名为vblib,并且增加一个简单的类为Parent,代码如下:
Public Class Parent
Public Sub DoSomething()
MsgBox(Parent Dosomething,MsgBoxStyle.Information.Parent)
End Sub
End Class
可能许多程序设计人员还不知道vb.net支持Windows窗体的可视化继承。可视化继承,就是说用户可以创建一个Windows窗体,然后可以继承这个窗体使得其他窗体具有与该窗体相同的版面布置、控件和行为。用户也可以使用继承来创建自己的Windows控件。比如,用户可以创建一个性能提高了的TextBox(文本框)来实现数据输入的特殊的有效性校验。具体的做法是:通过继承创建一个由原始文本框控件类继承而来的子类,并进行适当的修改以提高文本框的性能,使之可以实现对数据输入的有效性校验。这一点跟Web表单控件是相同的,Web表单控件可以由一个已经存在的Web表单控件来创建一个子类。用户的子类可以重载已有的函数或者增加一些新的函数。
Vb.net不仅提供了继承,而且还提供了其他许多重要的新特性。vb.net改进了创建和处理多界面的方法,使得用户可以更容易的使用它们。另外,vb.net支持事件作为界面的一部分,使得现在可以在界面上表达所有的元素:方法、属性、事件。此外,在vb.net中终止对象不是通过引用计数来实现,而是利用“垃圾收集”程序来将对象从内存中清除。总而言之,vb.net比起Visual Basic以前的版本变说,其面向对象的能力大大增加了,而且vb.net也保留了低版本的绝大多数的特性。
关于面向对象的详细理论请参阅后续章节:vb.net的OOP结构。