vb.net中的重写

这是涵盖VB.NET中重载、阴影和覆盖差异的迷你系列之一。本文介绍了覆盖。涵盖其他内容的文章如下:...

这是涵盖VB.NET中重载、阴影和覆盖差异的迷你系列之一。本文介绍了覆盖。涵盖其他内容的文章如下:

Getty Images/Jetta Productions photo of a woman using computer

->过载->阴影

这些技术可能会让人非常困惑;这些关键字和底层继承选项有很多组合。微软自己的文档并不能很好地解释这个主题,而且网上有很多不好的或过时的信息。确保程序正确编码的最佳建议是“测试、测试,然后再次测试”。在本系列中,我们将逐一介绍它们,重点介绍它们之间的差异。

覆盖

阴影、重载和重写的共同点是它们在更改发生的情况时重用元素的名称。阴影和重载可以在同一个类内操作,也可以在一个类继承另一个类时操作。但是,重写只能在从基类(有时称为父类)继承的派生类(有时称为子类)中使用。这就是锤子;它允许您完全替换基类中的方法(或属性)。

在关于类和Shadows关键字的文章中(请参见:VB.NET中的Shadows),添加了一个函数来显示可以引用继承的过程。

Public Class ProfessionalContact ' ... code not shown ... Public Function HashTheName( ByVal nm As String) As String Return nm.GetHashCode End Function End Class

实例化从此类派生的类(示例中为CodedProfessionalContact)的代码可以调用此方法,因为它是继承的。

在本例中,我使用VB.NET GetHashCode方法使代码保持简单,这返回了一个相当无用的结果,即值-520086483。假设我希望返回不同的结果,但是,

->我不能改变基类。(也许我所拥有的只是来自供应商的编译代码。)

... 和

->我无法更改调用代码(可能有一千个副本,我无法更新它们。)

如果我可以更新派生类,那么我可以更改返回的结果。(例如,代码可能是可更新DLL的一部分。)

有一个问题。因为它是如此全面和强大,您必须拥有基类的权限才能使用覆盖。但是设计良好的代码库提供了它。(您的代码库都设计得很好,对吗?)例如,我们刚才使用的Microsoft提供的函数是可重写的。下面是一个语法示例。

公共可重写函数GetHashCode为整数

所以这个关键字也必须出现在我们的示例基类中。

Public Overridable Function HashTheName( ByVal nm As String) As String

覆盖该方法现在就像使用Overrides关键字提供一个新方法一样简单。VisualStudio通过使用AutoComplete为您填充代码,再次为您提供了一个运行的开始。当你进入。。。

Public Overrides Function HashTheName(

VisualStudio会在键入左括号后自动添加其余代码,包括只从基类调用原始函数的return语句。(如果您只是添加了一些内容,那么在新代码执行之后,这通常是一件好事。)

Public Overrides Function HashTheName( nm As String) As String Return MyBase.HashTheName(nm) End Function

但是,在本例中,我将用其他同样无用的方法替换该方法,以说明它是如何完成的:将反转字符串的VB.NET函数。

Public Overrides Function HashTheName( nm As String) As String Return Microsoft.VisualBasic.StrReverse(nm) End Function

现在调用代码得到了完全不同的结果。(与关于阴影的文章中的结果进行比较。)

ContactID: 246 BusinessName: Villain Defeaters, GmbH Hash of the BusinessName: HbmG ,sretaefeD nialliV

您也可以覆盖属性。假设您决定不允许ContactID值大于123,应默认为111。您只需覆盖该属性,并在保存该属性时对其进行更改:

Private _ContactID As Integer Public Overrides Property ContactID As Integer Get Return _ContactID End Get Set(ByVal value As Integer) If value > 123 Then _ContactID = 111 Else _ContactID = value End If End Set End Property

然后,当传递较大的值时,您会得到以下结果:

ContactID: 111 BusinessName: Damsel Rescuers, LTD

顺便说一句,在到目前为止的示例代码中,在新的子例程中,整数值是双倍的(请参阅关于阴影的文章),因此将123的整数更改为246,然后再次更改为111。

VB.NET通过允许基类使用基类中的MustOverride和NotOverridable关键字明确要求或拒绝要重写的派生类,为您提供了更多的控制。但这两种方法都在相当特定的情况下使用。首先,不可超越。

既然公共类的默认值是不可重写的,为什么还要指定它呢?如果在基类中的HashTheName函数上尝试,则会出现语法错误,但错误消息的文本提供了线索:

不能为不重写其他方法的方法指定“NotOverridable”。

被重写方法的默认值正好相反:可重写。因此,如果您希望重写确实停止在那里,那么必须在该方法上指定NotOverridable。在我们的示例代码中:

Public NotOverridable Overrides Function HashTheName( ...

然后,如果类CodedProfessionalContact依次被继承。。。

Public Class NotOverridableEx Inherits CodedProfessionalContact

... 无法在该类中重写函数HashTheName。无法重写的元素有时称为密封元素。

.NET基金会的一个基本部分是要求明确定义每个类的目的,以消除所有不确定性。以前的OOP语言中有一个问题被称为“脆弱基类”。当基类在继承自基类的子类中添加与方法名同名的新方法时,就会发生这种情况。编写子类的程序员没有计划重写基类,但无论如何,这正是发生的事情。众所周知,这会导致受伤的程序员大喊:“我没有改变任何东西,但我的程序还是崩溃了。”如果将来有可能更新一个类并造成这个问题,请声明它不可超越。

MustOverride最常用于所谓的抽象类。(在C#中,同样的东西使用关键字Abstract!)这是一个只提供模板的类,您需要用自己的代码填充它。Microsoft提供了以下示例:

Public MustInherit Class WashingMachine Sub New() ' Code to instantiate the class goes here. End sub Public MustOverride Sub Wash Public MustOverride Sub Rinse (loadSize as Integer) Public MustOverride Function Spin (speed as Integer) as Long End Class

继续微软的例子,洗衣机做这些事情(清洗、漂洗和旋转)的方式完全不同,因此在基类中定义函数没有任何好处。但是,确保继承这个类的任何类都定义它们是有好处的。解决方案:一个抽象类。

如果您需要更多关于重载和重写之间差异的解释,那么在快速提示中会开发一个完全不同的示例:重载与重写

VB.NET通过允许基类使用基类中的MustOverride和NotOverridable关键字明确要求或拒绝要重写的派生类,为您提供了更多的控制。但这两种方法都在相当特定的情况下使用。首先,不可超越。

既然公共类的默认值是不可重写的,为什么还要指定它呢?如果在基类中的HashTheName函数上尝试,则会出现语法错误,但错误消息的文本提供了线索:

不能为不重写其他方法的方法指定“NotOverridable”。

被重写方法的默认值正好相反:可重写。因此,如果您希望重写确实停止在那里,那么必须在该方法上指定NotOverridable。在我们的示例代码中:

Public NotOverridable Overrides Function HashTheName( ...

然后,如果类CodedProfessionalContact依次被继承。。。

Public Class NotOverridableEx Inherits CodedProfessionalContact

... 无法在该类中重写函数HashTheName。无法重写的元素有时称为密封元素。

.NET基金会的一个基本部分是要求明确定义每个类的目的,以消除所有不确定性。以前的OOP语言中有一个问题被称为“脆弱基类”。当基类在继承自基类的子类中添加与方法名同名的新方法时,就会发生这种情况。编写子类的程序员没有计划重写基类,但无论如何,这正是发生的事情。众所周知,这会导致受伤的程序员大喊:“我没有改变任何东西,但我的程序还是崩溃了。”如果将来有可能更新一个类并造成这个问题,请声明它不可超越。

MustOverride最常用于所谓的抽象类。(在C#中,同样的东西使用关键字Abstract!)这是一个只提供模板的类,您需要用自己的代码填充它。Microsoft提供了以下示例:

Public MustInherit Class WashingMachine Sub New() ' Code to instantiate the class goes here. End sub Public MustOverride Sub Wash Public MustOverride Sub Rinse (loadSize as Integer) Public MustOverride Function Spin (speed as Integer) as Long End Class

继续微软的例子,洗衣机做这些事情(清洗、漂洗和旋转)的方式完全不同,因此在基类中定义函数没有任何好处。但是,确保继承这个类的任何类都定义它们是有好处的。解决方案:一个抽象类。

如果您需要更多关于重载和重写之间差异的解释,那么在快速提示中会开发一个完全不同的示例:重载与重写

  • 发表于 2021-10-10 10:14
  • 阅读 ( 174 )
  • 分类:数学

你可能感兴趣的文章

超载(overloading)和覆盖(overriding)的区别

过载与覆盖 重载和重写都是大多数编程语言的特性。重载是一种特性,它允许在同一个类中创建几个具有相同名称的方法,但在函数的输入类型和输出类型方面彼此不同。方法重载通常与在函数调用中强制类型检查的静态编程...

  • 发布于 2021-06-23 10:08
  • 阅读 ( 180 )

功能(function)和vb程序(procedure in vb)的区别

...执行某个任务并向调用代码返回值的过程,而过程是程序中的可执行语句块。 visualbasic(VB.NET)是在微软开发的.NET框架上实现的一种编程语言。它是一种现代的通用编程语言。它有助于开发高效的程序,而且更容易学习语言。...

  • 发布于 2021-07-01 18:59
  • 阅读 ( 279 )

vb语言(vb)和运动模拟(vb.net)的区别

...选项。VB是为一个简单而有能力的软件开发而设计的。VB中的程序基本上是一系列创建和操作变量的命令。这种语言的程序也称为宏。 VB.NET代表支持Visual Basic网络的技术。它是Microsoft的.NET framework语言之一。这种语言是专门为VB开...

  • 发布于 2021-07-13 21:15
  • 阅读 ( 253 )

vb.net中的强制转换和数据类型转换

...的过程。例如,将整数类型强制转换为字符串类型。VB.NET中的某些操作需要特定的数据类型才能工作。强制转换将创建所需的类型。本系列由两部分组成的第一篇文章,VB.NET中的强制转换和数据类型转换,介绍了强制转换。本文...

  • 发布于 2021-09-07 01:21
  • 阅读 ( 224 )

visual basic术语表

...务器和客户端之间传输信息。例如,“购物车”应用程序中的表单可能包含有关购买特定项目的请求的信息。可以使用CGI将信息传递到web服务器。CGI仍然被大量使用,ASP是一个完整的替代方案,可以更好地与Visual Basic配合使用。...

  • 发布于 2021-09-10 22:25
  • 阅读 ( 238 )

什么是vb.net资源及其使用方法(vb.net resources and how)

...择“资源”选项卡。您可以通过双击解决方案资源管理器中的“我的项目”或“项目”菜单项下的“项目属性”来打开此对话框。 资源文件的类型 串 图像 图标 音频 文件夹 其他 资源文件简化了全球化 使用资源文件增...

  • 发布于 2021-09-11 23:50
  • 阅读 ( 181 )

处理对象

...毁它。GC方法在Java等语言中有着良好的历史,并且是.NET中的重大改进之一。 在下一页中,我们将查看IDisposable界面。。。需要在自己的代码中处置非托管对象时使用的接口。 如果您为自己的使用非托管资源的对象编写代码,...

  • 发布于 2021-09-11 23:51
  • 阅读 ( 223 )

vb.net控件继承编程简介

...在VB.NET中打开新的Windows应用程序项目。->将工具箱中的复选框添加到表单中。->单击解决方案资源管理器顶部的“显示所有文件”按钮。 这将显示VisualStudio为您的项目创建的文件(因此您不必这样做)。作为一个...

  • 发布于 2021-09-11 23:52
  • 阅读 ( 182 )

vb.net解决方案和项目文件“sln”和“vbproj”

...;一整套项目可以是同一解决方案的一部分,该.sln文件中的设置和选项可以应用于其中的所有项目。在VisualStudio中一次只能打开一个解决方案,但该解决方案中可以打开许多项目。这些项目甚至可以使用不同的语言。 通过创...

  • 发布于 2021-09-11 23:55
  • 阅读 ( 221 )

vb.net中的region指令

...,这确实有效: 如果您从internet借用代码,请先查找其中的区域,然后再将其添加到代码中。众所周知,黑客会在一个区域内嵌入不好的东西,以防被发现。

  • 发布于 2021-09-11 23:55
  • 阅读 ( 175 )
eGeTddGvQh
eGeTddGvQh

0 篇文章

相关推荐