一点通VB.NET构造器讲解
创始人
2024-06-10 11:41:30
0

面向对象编程现在被大多数人使用,这里我们一起来看看关于面向对象中构造器的理解。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 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
规避非法攻击 用好路由器远程管... 单位在市区不同位置设立了科技服务点,每一个服务点的员工都通过宽带路由器进行共享上网,和单位网络保持联...
范例解读VB.NET获取环境变... VB.NET编程语言的使用范围非常广泛,可以帮助开发人员处理各种程序中的需求,而且还能对移动设备进行...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...