19

オープン/クローズド再帰の説明をいくつか見つけましたが、定義に「再帰」という言葉が含まれている理由や、動的/静的ディスパッチとの比較がわかりません。私が見つけた説明の中には、次のようなものがあります。

再帰を開く。オブジェクトとクラスを持つほとんどの言語で提供されるもう 1 つの便利な機能は、1 つのメソッド本体が、selfまたは一部の言語ではthis. self の特別な動作は、遅延バインドされていることです。これにより、あるクラスで定義されたメソッドが、最初のクラスのサブクラスで後で定義された別のメソッドを呼び出すことができます。[ラルフ・ヒンツェ]

...またはウィキペディアで:

のディスパッチ セマンティクスthis、つまり this のメソッド呼び出しが動的にディスパッチされることは、オープン再帰と呼ばれ、派生クラスまたはオブジェクトによってこれらのメソッドをオーバーライドできることを意味します。対照的に、関数の直接の名前付き再帰または匿名再帰は、クローズド再帰を早期バインディングと共に使用します。

また、StackOverflow の質問:オープン再帰とは何ですか?も読みました。

しかし、定義に「再帰」という言葉が使われている理由がわかりません。もちろん、メソッドの再帰呼び出しを行うことで「オープン再帰」を使用すると、興味深い (または危険な) 副作用が発生する可能性があります。しかし、定義はメソッド/関数の再帰呼び出しを直接考慮していません (ウィキペディアの定義の「閉じた再帰」を除いて、「開いた再帰」は再帰呼び出しを参照していないため、奇妙に聞こえます)。

定義に「再帰」という言葉がある理由を知っていますか? 私が認識していない別のコンピューター サイエンスの定義に基づいているためですか? 単に「動的ディスパッチ」と言うだけでは不十分ですか?

4

1 に答える 1

29

私はここに答えを書き始めようとしましたが、それについてのブログ投稿全体を書くことになりました. TL;DR は次のとおりです。

したがって、実際のオブジェクト指向言語を、構造と関数だけの単純な言語と比較すると、次のような違いがあります。

  • すべてのメソッドは、相互に認識して呼び出すことができます。それらの定義は「同時」または相互に再帰的であるため、それらが定義される順序は重要ではありません。
  • 基本メソッドは、派生レシーバー オブジェクト (つまり、他の言語では this または self) にアクセスできるため、互いに閉じ合うことはありません。それらはオーバーライドされたメソッドに対してオープンです。

したがって、再帰を開きます。

于 2013-08-26T18:27:53.830 に答える