gpt4 book ai didi

.net - 如何基于多态性干净地处理不同的行为

转载 作者:行者123 更新时间:2023-12-04 19:19:44 24 4
gpt4 key购买 nike

假设我有一个接口(interface) IFoo带有实现类VideoFoo , AudioFoo , 和 TextFoo .进一步假设我不能修改任何代码。假设我想编写一个根据 IFoo 的运行时类型执行不同操作的函数。 , 如

Public Class Bar
Public Shared Sub Fix(ByVal Foo as IFoo)
If TypeOf Foo Is VideoFoo Then DoBar1()
If TypeOf Foo Is AudioFoo Then DoBar2()
If TypeOf Foo Is TextFoo Then DoBar3()

End Sub
End Class

我想重构它以使用重载方法:
Sub DoBar(ByVal foo as VideoFoo)
Sub DoBar(ByVal foo as AudioFoo)
Sub DoBar(ByVal foo as TextFoo)

但我看到做这样的事情的唯一方法就是写
Sub DoBar(ByVal foo as IFoo)

然后我必须再次执行我的“If TypeOf ... Is”。我如何重构它以利用 IFoo 的实现的多态性无需手动检查类型?

(在 VB.NET 中,虽然我的问题也适用于 C#)

最佳答案

你问的是Multiple Dispatch ,或允许在运行时而不是编译时进行方法重载解析的语言功能。

不幸的是,C# 和 VB.NET 都是单调度语言,这意味着方法重载是在编译时选择的。这意味着将始终为 IFoo 选择 IFoo 对象的重载,而不管其实现类型如何。

然而,有一些方法可以解决这个问题。一种方法是使用访问者设计模式来实现双分派(dispatch),这是可行的。在 C# 中,您还可以使用新的 dynamic关键字强制运行时环境在运行时解决重载。我写了一个blog entry关于如何使用这种技术执行碰撞处理,但它当然也适用于你正在做的事情。

我对 VB.NET 不是很熟悉,但我相信如果将对象强制转换为 Object,则默认情况下该语言会表现出一些动态行为。如果这是错误的,请有人纠正我。

关于.net - 如何基于多态性干净地处理不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5425228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com