1

众所周知,类继承是“开放的”类型层次结构,而有区别的联合是“封闭的”类型层次结构。然而,虽然添加新的子类很容易,但添加新的虚函数需要修改所有现有类。同时,有区别的工会可以很容易地添加新的功能。

             | 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:是否有一种常见的抽象(类似于访问者模式)来处理向可区分联合添加类型?

4

1 回答 1

0

如果我正确理解你的问题,我会支持桥模式。它使您可以独立于其实现来改变接口/抽象,从而实现结构上的灵活性。但是,我从来没有需要使用桥接模式。

希望有所帮助:D

于 2012-10-18T12:15:14.943 回答