写点什么

VB 中动态编程的技巧和挑战:多重分派

  • 2007-06-20
  • 本文字数:1777 字

    阅读完需:约 6 分钟

随着 VBx 对动态编程的更多支持计划,现在来讨论 Visual Basic 中已经存在的动态属性是个不错的时机。这一部分,我们讨论多重分派(Multiple Dispatch)。

多重分派,也就是我们常说的多重方法,是一个和函数重载相关的技术。主要的不同是时间的选择。在使用重载函数时,编译器决定在编译时调用哪个函数,看下面的代码:

<span>Option</span> <span>Strict</span> <span>On<span color="#000000"><br></br></span></span><span>Module</span> Module1<p><span>Sub</span> Main()</p><br></br><span>Dim</span> obj <span>As</span> A<br></br><span>If</span> Console.ReadKey.KeyChar = <span>"A"</span> <span>Then<br></br></span> obj = <span>New</span> A<br></br><span>Else<br></br></span> obj = <span>New</span> B<br></br><span>End</span> <span>If<br></br></span> Console.WriteLine(Foo(obj))<br></br> Console.ReadLine()<p><span>End</span> <span>Sub</span> <span>Function</span> Foo(<span>ByVal</span> value <span>As</span> A) <span>As</span> <span>String<br></br></span> <span>Return</span> <span>"Function A Object Type "</span> + value.RealName()</p><br></br><span>End</span> <span>Function</span> <span>Function</span> Foo(<span>ByVal</span> value <span>As</span> B) <span>As</span> <span>String<br></br></span> <span>Return</span> <span>"Function B Object Type "</span> + value.RealName()<br></br><span>End</span> <span>Function<p>End</p></span> <span>Module<p>Class</p></span> A<br></br><span>Public</span> <span>Overridable</span> <span>Function</span> RealName() <span>As</span> <span>String<br></br></span> <span>Return</span> <span>"A"<br></br></span> <span>End</span> <span>Function<br></br>End</span> <span>Class<br></br>Class</span> B<br></br><span>Inherits</span> A<br></br><span>Public</span> <span>Overrides</span> <span>Function</span> RealName() <span>As</span> <span>String<br></br></span> <span>Return</span> <span>"B"<br></br></span> <span>End</span> <span>Function<br></br>End</span> <span>Class<br></br></span>运行代码,你要么看到“Function A Object Type A”,要么是“Function A Object Type B”。尽管 obj 指向了类型 B 的一个对象,编译器却已经决定了 Foo 的第一个版本会被调用。这种情况有时被称为单一分派,对初级程序员来说,常是一个难理解的概念。

如果做了下面代码中所示的一些改变,那么时间的选择也随之改变,选择会被推迟到运行时。

Option Strict Off 'Change 1 - Late binding is enabled

Sub Main()
Dim obj 'Change 2 - obj is late bound
If Console.ReadKey.KeyChar = “A” Then
obj = New A
Else
obj = New B
End If
Console.WriteLine(Foo(obj))
Console.ReadLine()

End Sub

用这个版本,你会看到“Function A Object Type A”或者“Function B Object Type B”。这种在运行时选择正确函数的能力,就是人们所说的动态分派。

动态分派不仅仅是在支持后绑定(Late Binding)语言中处理重载的一个有趣的前沿话题,它还是处理同质列表(Homogoneous List)的一项有用技术。

让我们假设在一个窗体中,它里面的每个控件类型都有自己的格式函数,你想为所有的控件都设置上定制的格式。例子里包括 FormatControl(TextBox) 和 FormatControl(ListBox)。

使用一个静态类型语言,比如 C#,你须要在窗体的控件集合里通过一个循环调用每个控件的 FormatControl。但是,因为函数是在编译时被选定的,你不得不提供一个称为 FormatControl(control) 的泛型函数。然后这个泛型使用一个巨大的 if/else-if 块来选择要调用的真实函数。

通过使用动态分派,运行时要选定调用哪个版本的 FormatControl 取决于内存里的对象,而不需要 if/else-if 程序块。这儿仍然需要 FormatControl(control),但是它只是一个用于扣住这些控件的空函数。

在依赖动态分派进行编程时,必须使用 Caution(这个编译器选项)。因为选择被推迟到运行时,那时如果没有找到一个合适的重载的话,可能会产生异常。在静态类型语言里这不是一个问题,因为你会收到编译器给出的异常报告。

查看英文原文: VB Tips and Trips: Multiple Dispatch

2007-06-20 22:27802

评论

发布
暂无评论
发现更多内容

昇腾CANN 7.0 黑科技:大模型训练性能优化之道

华为云开发者联盟

人工智能 华为云 大模型 昇腾CANN 华为云开发者联盟

selenium基础语法详解。

百度搜索:蓝易云

Java Python Web API selenium

MySQL常用图形管理工具

小齐写代码

简单好用的图片查看软件:EdgeView 4中文激活最新版

mac大玩家j

Mac软件 图片查看器 图片查看软件

掌握 Kubernetes 故障排除:有效维护集群的最佳实践和工具

SEAL安全

集群 故障排除 kubernetes 运维 企业号10月PK榜

优测云测试平台 | 有效的单元测试

优测云服务平台

测试 单元测试 云平台 测试开发

AI见证每一跳的闪耀!百度成为中国国家跳水队人工智能合作伙伴

飞桨PaddlePaddle

人工智能 百度

硬件信息查看软件 EtreCheckpro免激活最新版

胖墩儿不胖y

Mac软件 系统维护软件

你真的了解你的团队吗? ONA告诉你真相

用友BIP

人才发展

用友x德勤 | 引领全球化潮流,用友与德勤携手助力中企出海

用友BIP

初探亚马逊 AI 编程助手 CodeWhisperer

亚马逊云科技 (Amazon Web Services)

人工智能’ 云上探索实验室 Amazon CodeWhisperer

大模型的幻觉 (Hallucination) 因何而来?如何解决幻觉问题?

Baihai IDP

人工智能 AI 大模型 白海科技 大模型幻觉

Zebec Protocol 薪酬支付工具 WageLink 上线,掀新一轮薪酬支付浪潮

西柚子

什么是特权账号?

尚思卓越

网络安全 数据安全 特权账号管理 PAM

全网最详细4W字Flink全面解析与实践(上)

Java随想录

Java 大数据 flink

我和极客时间的故事

查拉图斯特拉说

我和极客时间的故事

东莞理工网安学院“火焰杯”软件测试高校就业选拔赛颁奖典礼

测试人

软件测试

ARTS-WEEK10(23.10.16-23.10.22)

EchoZhou

Spring Boot是什么?它的优点是什么?

百度搜索:蓝易云

云计算 spring Linux 运维 Spring Boot

Programming abstractions in C阅读笔记:p181-p183

codists

新华网专访王文京:“数据驱动 智能运营”是企业数智化的全新阶段

用友BIP

数据驱动

从基础到实践,回顾Elasticsearch 向量检索发展史

华为云开发者联盟

人工智能 深度学习 华为云 华为云开发者联盟

VB中动态编程的技巧和挑战:多重分派_.NET_Jonathan Allen_InfoQ精选文章