众所周知,类继承是“开放的”类型层次结构,而有区别的联合是“封闭的”类型层次结构。然而,虽然添加新的子类很容易,但添加新的虚函数需要修改所有现有类。同时,有区别的工会可以很容易地添加新的功能。
| inheritance | discriminated union
new type | easy | hard
new function | hard | easy
OOP 已经出现了足够多的时间,以至于我们经历了“向类型层次结构中添加新方法”的困难,并且在“修改所有类”不是一个好选择的情况下,我们提出了诸如访问者模式之类的东西为现有类型添加新功能。
例如:
class Base Base.f() Base.g()
class A : Base A.f() A.g()
class B : Base B.f() B.g()
因为添加虚拟Base.h()
是困难的,所以我们使用访问者模式,所以可以封装未来的功能。这基本上是模式匹配函数的基于继承的类似物!
class H : BaseVisitor {
visit(A) { }
visit(B) { }
}
// this looks really similar to:
let H something =
match something with
| A -> ..
| B -> ..
TLDR:是否有一种常见的抽象(类似于访问者模式)来处理向可区分联合添加类型?