したがって、Squeak / PharoはTraitsをサポートし、NewspeakにはMixinsがあります。違いはなんですか?トレイトにはinstVarsがありませんが、Mixinsにはありますか?
3 に答える
適切な比較と、特性が好まれる理由については、特性論文 (pdf)を参照してください。
本質的に、それはルーカス・レングリが言ったことです:
特性メンバーはクラスに構成され、その継承階層は変更されません。競合は、特性のユーザーが明示的に解決する必要があります。
Mixin は、ターゲット クラスの継承階層に線形化されます。競合するメンバーがある場合、それらが宣言された順序によって、どのメンバーが呼び出されるかが決まります。これは構成の動作を暗黙的に定義するため脆弱であり、クラスの作成者は潜在的な競合と、それらが結果のクラスにどのように影響するかを認識している必要があります。
ミックスインは線形化されるため、多重継承の悪名高い「ダイアモンド問題」に悩まされることはありません。したがって、それらが積み重ねられた壊れやすい性質は別の問題です。私はこれを「ルビーの問題」と呼んで、貴重な石の比喩に当てはめます。ヘラジカに関係するいくつかの奇妙な理由により、真珠はルビーほど問題を描写していません。
特性は合成規則を使用して合成されます。競合は手動で解決する必要があります。トレイトが誤って同じ名前の別のメソッドをオーバーライドすることはありません。
Mixin は順序によって構成されるため、多重継承に似た脆弱性の問題があります。
Newspeakでは、すべてのクラスがミックスインです。Newspeakディスカッションフォーラムの同様の質問に対するGiladBrachaの回答からの抜粋を次に示します。
ミックスインは、Newspeak自体の機能ではありません。つまり、「OK」という言語を設計していません。次に、ミックスインを追加します。ミックスインは、クラスのネストとメッセージベースのセマンティクスから自動的に除外されます。つまり、仮想クラスがある場合、実際にそれらを禁止しない限り、ミックスインがあります。..。
特性は、ミックスインの認識された問題に対処しようとします。
- これらの認識された問題が現実であることを示す実際の経験はほとんどありません。
- 特性はステートレスに制限されています。これは問題を単純化しますが、関心のあるすべてのケースを処理するわけではありません。実際、現在、特性に状態を追加しようとしている研究論文があります。
特性は、私が何年も前に博士論文で考案した、より一般的なモデルに完全に組み込まれています(本当に深く掘り下げたい場合は、私のWebサイトから入手できます)。...これらのコンビネータをNewspeakに組み込む方法を検討したいと思います。..。