一点通VB.NET构造器讲解

开发 后端
这里介绍了VB.NET构造器,每个构造器开始处都会进行隐含的赋值,保证在构造器运行时,所有的字段都包含正确的初始值。

面向对象编程现在被大多数人使用,这里我们一起来看看关于面向对象中构造器的理解。VB.NET构造器的范围对类的行为有重要的含义。一个Public类中的Friend构造器使我们只可以从同一个程序集内部创建这个类,所以它同你在VB6的类中用的PublicNotCreatable设置有很多共同之处。一个私有的(private)VB.NET构造器使这个类根本不能创建,如果类只是共享方法的一个容器,这种构造器就很有用。

#T#(这样的类的例子有System.Console和System.Environment。)更确切地说,一个代码片段可以实例化一个带有私有构造器的类,只要那个代码位于类内部或嵌套的类中,因为一个嵌套的类型可以访问包含它的类型的私有的成员。创建只包含一个共享成员的一个 VB.NET类的更简单的方法就是定义一个Module。Module是规则的、不能创建的类,它的成员是静态的。注意,.NET runtime对模块并不很重视(C#中没有Module):VB.NET对模块的支持只可以简化VB6代码的移植,而且编译器将一个Module中的所有成员都明确地转换成静态成员。

注意初始化字段,前面的讲述可能意味着私有VB.NET构造器只有在很少的情况下才有用,但实际并不是这样的。例如,当你的类包含许多字段的初始化设置时,定义一个空的Private Sub New过程就很方便:

  1. Public MinSize As Integer = 10 
  2. Public MaxSize As Integer = 1000 
  3. ' ...(other fields with initializers) 

编译器在每个构造器开始处都会进行隐含的赋值,保证在构造器运行时,所有的字段都包含正确的初始值。如果你有20个初始化字段和10个构造器,那么你的类就会包含多达200个隐含的赋值,这样就会浪费内存中和磁盘上的字节。如果你定义一个虚拟的不带参数的私有构造器,并让所有的公有构造器调用它,那么编译器就只添加20个隐含的语句到私有构造器中。通过Microsoft Intermediate Language Disassembler(ILDASM)运行产生的可执行的文件,你就可以看到在每种情况下编译器创建的代码。

当客户端要通过一个共享的函数(作为类的工厂方法(factory method ))来创建类的实例时,就体现了私有构造器的另一个好处。一个共享的方法可以让你在创建类的一个新实例前运行一些代码——例如,查看一个具有相同属性的对象是否在你内部管理的对象池中。你不能用一个规则的构造器来实现这种功能,因为只有在一个新实例已经运行时,规则的构造器的代码才运行(见列表1)。

你在从一个类派生一个更简单的新类时,可以看到OOP的强大。派生的类自动继承基类的所有字段、属性、事件和接口,所以你只需要关注你想添加到派生的类中的成员:

  1. Class Person  
  2. Public FirstName As String  
  3. Public LastName As String  
  4. Function CompleteName() As String  
  5. Return FirstName & " " & LastName  
  6. End Function  
  7. End Class  
  8. Class Customer  
  9. Inherits Person  
  10. ' a new field and a new method  
  11. Public Title As String  
  12. Function ReverseName() As String  
  13. Return LastName & ", " & FirstName  
  14. End Function  
  15. End Class 

更好的是,如果你期望派生的类有不同的行为,你还可以覆盖基类中的属性或方法。例如,你可能想让Customer.CompleteName方法以 “Mr. John Doe”的形式返回一个字符串。你必须做两件事来覆盖一个成员:将基类的成员标记为Overridable,使它成为一个虚拟的成员,用关键字 Overrides来标记派生的类的成员:

  1. ' in Person class  
  2. Overridable Function CompleteName() As String  
  3. ' ...(as before)  
  4. End Function  
  5.  
  6. ' in Customer class  
  7. Overrides Function CompleteName() _  
  8. As String  
  9. Return Title & " " & FirstName _  
  10. & " "& LastName  
  11. End Function  

重用基类中的代码
Visual Studio .NET为我们在一个派生的类中写被覆盖的成员的代码提供了一个很好的捷径:在编辑窗口上方最左边的ComboBox中选择类名字下的(Overrides)成员,然后在最右边的ComboBox中选择你想覆盖的成员(见图1)。在派生的类中你不需要用关键字Overridable,因为被覆盖的方法本身就是可以被覆盖的。如果你出于某种原因想停止进一步覆盖那个方法,你必须用关键字NotOverridable标记它:

  1. ' derived classes can't override this  
  2. NotOverridable Overrides Function _  
  3. CompleteName()As String  
  4. ' ...  
  5. End Function 
责任编辑:田树 来源: 博客
相关推荐

2009-11-03 09:09:19

VB.NET类

2009-10-28 14:30:16

VB.NET RmDi

2009-11-10 17:04:29

VB.NET基础知识

2009-10-26 10:12:14

VB.NET操作MsA

2009-11-02 11:22:59

VB.NET文本文件操

2009-10-12 13:32:58

VB.NET线程构造器

2009-11-04 14:37:40

ADO.NET XML

2009-10-20 10:16:24

VB.NET COMB

2010-01-11 16:04:10

VB.NET使用wit

2009-10-23 13:10:14

VB.NET List

2009-10-12 13:54:22

VB.NET Data

2009-10-15 11:42:05

VB.Net赋值语句

2009-10-14 17:21:47

VB.NET定制Win

2010-01-18 18:20:49

VB.NET使用API

2009-10-13 14:42:30

VB.NET静态成员

2009-11-03 09:48:47

VB.NET构造

2009-11-02 09:43:01

VB.NET构造函数

2009-12-15 14:27:30

Ruby存取器

2010-01-14 15:44:17

VB.NET数据绑定

2009-10-29 11:26:28

VB.NET调用Web
点赞
收藏

51CTO技术栈公众号