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:判別共用体への型の追加を扱う一般的に見られる抽象化 (Visitor パターンに類似) はありますか?

4

1 に答える 1

0

あなたの質問を正しく理解できれば、Bridge パターンを支持します。インターフェイス/抽象化を実装とは別に変更できるため、構造的な柔軟性が得られます。ただし、ブリッジ パターンを使用する必要はありませんでした。

お役に立てば幸いです:D

于 2012-10-18T12:15:14.943 に答える