クラスとプロトタイプ
Self と Smalltalk の最も明確な違いは、 Self にはClassesの概念がないことです。オブジェクトとクラスの間に「<em>はインスタンスである」という関係はありません。Self はむしろ、最初のプロトタイプのオブジェクト指向言語の 1 つであり、この点で JavaScript の前身です。したがって、Smalltalk で新しいオブジェクトを作成する一般的な方法はインスタンス化ですが、Self ではクローン作成です。
実行とメッセージ
既にお気づきのように、2 つ目の基本的な違いは、Self では実行の唯一の概念がメッセージ sendであるのに対し、Smalltalk では代入とオブジェクト フィールドへのアクセスも存在することです。さらに、 Self にはグローバルな状態というものはありません。メッセージを送信して取得できるものにのみアクセスできます。ただし、自己はいくつかの「既知のオブジェクト」を追跡し、新しく作成されたオブジェクトを与えることができます。
状態とスロット
前の 2 つの点、「クラスなし」と「メッセージのみ」を熟考すると、オブジェクトの状態とその動作の間の Smalltalk の区別 が Self に直接存在しないことが明らかになります。Smalltalkがオブジェクトのインスタンス変数に状態を格納し、そのクラスのメソッド ディクショナリに動作を格納する場合、 Self は、状態と動作の両方を表現できるスロットの概念を使用します。
共有動作
行動の組織化を支援するために、Self はプロトタイプだけでなくtraitも提供します。特性は、動作のみを含むオブジェクトであり、複数のオブジェクトが共有します。(さらに、他のオブジェクトに構成できるmixin 、動作と状態の小さな部分もあります)。
Self 内のオブジェクトは、オブジェクト自体が理解できないメッセージが送信される親を持つことができます ( delegation )。これにより、Smalltalk のクラス継承に似た階層が作成されますが、クラスは必要ありません。
いくつかの例
新しいオブジェクトの作成
スモールトーク
Object new
自己:
- プレーンなオブジェクト:
()
または(||)
(スロットがないことを明示するため)
- コピーされたオブジェクト:
someObject copy
いくつかのフィールドを持つオブジェクトの作成
スモールトーク
Object subclass: #MyObjects instanceVariableNames: 'foo bar'. "…"
MyObject new.
自己
( | foo. bar | )
コレクションを作る
スモールトーク
OrderedCollection new.
自己
list copy.
「継承」</h3> Smalltalk
Object subclass: #MyObject. "…"
自己
( | parent* <- list | )
資力
Self ウェブページの参考文献セクションを読むことをお勧めします。