1
众所周知,类继承是“开放”类型 - 分区和歧视联盟是“封闭”类型 - 分区。但是,虽然添加新的子类很容易,但添加新的虚拟函数需要修改所有现有的类。同时,受歧视的工会可以轻松添加新的功能。用于扩展歧视联盟的“设计模式”
| inheritance | discriminated union
new type | easy | hard
new function | hard | easy
OOP已经有足够的,我们所经历的困难,“添加新的方法,以一种层次结构”,并在情况下,“修改中的所有类”是不是一个好的选择,我们来到与Visitor模式之类的东西一起为现有类型添加新功能。
例如:
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:是否有与添加类型为区分联合涉及一个常见的抽象(类似访问者模式)?