10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

评论

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

虎符交易所Hoo研究院|关于跨链(上)——Cosmos

区块链前沿News

虎符交易所

[Day7]-[动态规划] 最大子数组和

方勇(gopher)

LeetCode 动态规划 数据结构与算法、

OpenMLDB 获评 CSDN IT 技术影响力之星 “年度开源项目”奖项

第四范式开发者社区

人工智能 深度学习 数据库 开源 特征平台

建木持续集成平台v2.2.5发布

Jianmu

开源 持续集成 开发运维 建木CI

linux之ssh-keygen命令

入门小站

Linux

直播回顾| Apache Pulsar 2.10.0 新特性概览

Apache Pulsar

开源 架构 云原生 Apache Pulsar Apache Pulsar 社区

Flink 在 B 站的多元化探索与实践

Apache Flink

大数据 flink 编程 流计算 实时计算

王者荣耀商城异地多活架构设计

smile

王者荣耀商城异地多活架构设计

张逃逃

浅谈电商网站开发中用户会话管理机制的设计和实现原理

汪子熙

JavaScript 电商 用户管理 电商系统 4月月更

高性能云桌面服务提供商酷栈科技加入龙蜥社区,共建开源新生态

OpenAnolis小助手

开源 云桌面 龙蜥社区 CLA 酷栈科技

在线OPML压缩工具

入门小站

工具

在线XML转CSV工具

入门小站

工具

为什么Java仍旧生机盎然——对“为什么Java正在消亡”的回应

Geek_rze78a

Java

带码农《手写Mybatis》进度3:实现映射器的注册和使用

小傅哥

小傅哥 mybatis 手写Mybatis

使用 Next.js、LeanCloud 和 Tailwind CSS 创建全栈应用

张泽豪

全栈 LeanCloud nextjs Tailwind Vercel

Hoo虎符研究院|区块简报220406期

区块链前沿News

虎符交易所

怒肝 JavaScript 数据结构 — 栈篇(一)

杨成功

JavaScript 数据结构 4月月更

【架构学习 07】——王者荣耀商城异地多活架构设计

tiger

架构实战营

Flink on K8s 在京东的持续优化实践

Apache Flink

大数据 flink 编程 流计算 实时计算

模块二

ASCE

王者荣耀商城异地多活架构设计

风中奇缘

架构实战营 「架构实战营」

面试突击37:线程安全问题的解决方案有哪些?

王磊

Java java面试

OceanBase 在江西人社养老统筹系统的实践分享

OceanBase 数据库

oceanbase 江西人社

手机应用使用情况监控统计APP

android App 自律

深入剖析 RocketMQ 源码 - 负载均衡机制

vivo互联网技术

负载均衡 分布式 java

架构实战训练营模块七

刘帅

【模块七】王者荣耀商城异地多活架构设计

yhjhero

架构训练营

web前端培训-数组扁平化实现方式

@零度

前端开发 ES6

最全讲解:GPU技术架构知识

Finovy Cloud

人工智能 GPU服务器 GPU算力

TDesign 更新周报(2022年4月第1周)

TDesign

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