写点什么

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:27981

评论

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

非凸科技荣登“2024上海软件和信息技术服务业高成长百家”榜单

非凸科技

非凸科技 高成长百家

C#委托的前世今生

不在线第一只蜗牛

C#

全面解析SD-WAN组网:提升企业网络效率

Ogcloud

SD-WAN 企业组网 SD-WAN组网 SD-WAN服务商 SD-WAN国际专线

SD-WAN 助力SaaS应用加速,提升企业办公效率

Ogcloud

SD-WAN SD-WAN组网 SD-WAN服务商 SaaS应用加速 SD-WAN国际专线

央视《新闻联播》点赞广域铭岛:为新型工业化提供强劲动能

新消费日报

虚拟化世界,正上演一场「星际穿越」

白洞计划

AI

枫清科技高雪峰:从数据到知识,重塑产业智能化的核心驱动力

Fabarta

AI应用 #大模型 生成式 AI 应用 企业 AI 应用

数百名研发人员用通义灵码,33%新增代码由AI生成,信也科技研发模式焕新升级

阿里巴巴云原生

阿里云 云原生 通义灵码

数百名研发人员用通义灵码,33%新增代码由AI生成,信也科技研发模式焕新升级

阿里云云效

阿里云 云原生 通义灵码

See Video, Get 3D,智源开源无标注视频学习3D生成模型See3D

智源研究院

Altair 技术助力 Cleveland Golf 打破传统设计局限,实现新款 HiBore XL 球杆强大的功能

Altair RapidMiner

AI 设计 仿真 智能制造 altair

区块链软件系统海外宣发:全球化市场中的策略与实施

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 交易所开发代币开发

和鲸Heywhale人工智能通识课解决方案重磅上线!

ModelWhale

Python 人工智能 大数据 教改

区块链软件系统开发:从设计到实现的全面指南

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发

国产化战略下,软件信创化都有哪些利好?

FinFish

小程序容器 信创化软件 国产化软件 信创化中间件

制造业数字化转型,需要用到哪些系统,一文分析详解!

积木链小链

制造业 ERP

快速提升可视化设计工作效率

inBuilder低代码平台

UX 可视化设计

基于云主机的ModelArts模型训练实践,让开发环境化繁为简

华为云开发者联盟

容器 模型训练 华为云ModelArts AI 大底座 #docker

星芒云“1+6+N”数字生态方案

明道云

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