web-dev-qa-db-ja.com

ミックスインのみの継承で言語を作ってみませんか?

すべてのクラスベースまたはプロトタイプのOOP言語では、 mixins は後付けまたは二次機能のいずれかです。しかし、私には、従来の継承は単に単一のミックスインを使用する特定のケース。

これは歴史的な理由と親しみやすさによるものだと思いますが、他に何かあるのでしょうか?カプセル化された状態の安全な共有に関する問題?

19
Den

ミックスインに関する精力的な論文は Gilad Bracha の博士論文 The Programming Language Jigsaw:Mixins、Modularity and Multiple Inheritance

次のようなすべての質問に対する回答があります

  • ミックスインのみの継承で言語を作ってみませんか?

    ジグソーisそのような言語、そのまま Newspeak 、ブラチャの現在の言語

  • しかし、私には、従来の継承は単一のミックスインを使用する特定のケースにすぎないように見えます。

実際、mixin継承は、単一(クラスベース)継承(Simula-/Smalltalkスタイルの継承とベータスタイルの接頭辞)のすべての古典的な形式と、線形化による複数のクラスベースの継承(CLOS、C++、Python、 …)

Newspeakをご覧になることをお勧めします。 「クラス」があるという事実にだまされてはいけません。彼らは実際にはミックスインです。ジグソーペーパーでは、クラスをミックスインに昇格させる方法を説明しています。それが、ニュースピークでの動作とまったく同じです。

基本的に、ミックスインはスーパークラスを知らないクラスです。したがって、継承ツリーの複数の場所に表示される可能性があります。 (これはではない多重継承であることに注意してください!実際、これはある意味で正反対または二重です。多重継承では、クラスは複数のスーパークラスを持つ単一の場所。ミックスイン継承では、クラスは単一のスーパークラスを持つ複数の場所に表示されます。)

Newspeakでは、OOは極端に解釈されます:everythingis a message send( "virtual method/function call") Javanese/C++の場合)。スーパークラスのルックアップでさえあります。したがって、クラスSubSuperのサブクラスとして宣言すると、Subのスーパークラスは、 Subの内部実装、いいえ、スーパークラスが必要なときはいつでも(たとえば、メッセージディスパッチ(Javanese/C++での仮想メソッド/関数ルックアップ/ディスパッチ))、ランタイムはSuperを名前として解釈しますクラスを返すメソッドの呼び出しです。ただし、実行時にどのクラスが返されるかは不明です。実際、毎回異なるクラスを返す可能性があります!したがって、Newspeakのクラスはスーパークラスを認識しません。 /ミックスインの定義。

プロトタイプベースの言語では、専用のミックスインを使用するという考えは意味をなさないことに注意してください。プロトタイプベースの言語の要点は、2種類の「もの」(オブジェクトとクラス、オブジェクトと特性、オブジェクトとミックスインなど)とは対照的に、1種類の「もの」(オブジェクト)しかないということです。もちろん、それらはデザインパターンとして使用できます。結局のところ、多重継承のクラスを持つLISPのFlavorsオブジェクトシステムでそれらが最初に発明された方法ですが、これらのクラスは奇妙な方法で使用されることが多く、それらはミックスインと呼ばれ、そこからオブジェクトシステムの名前が付けられました)。

31
Jörg W Mittag