スモールトークへようこそ!Smalltalk の優れた点の 1 つは、開発者を信頼していることです。開発者は、その信頼がもたらす力から恩恵を受けます。したがって、「できない」や「違法」などの言葉はほとんど当てはまりません。
他のほとんどのものと同様に、Smalltalk の抽象クラスは、厳格な法則というよりも提案/ポインターに似ています。探している 2 つの手がかりは、#subclassResponsibility と #shouldNotImplement です。これら 2 つのメソッドは、特定のメソッドを含めるかどうかにかかわらず、サブクラス作成者にとって手がかりになります。送信者に画像の例を確認してください (常に質問の出発点として最適です)。
上記のように、「抽象」は実際にはメソッドごとであるため、例はエラーを生成しません (#subclassResponsibility または #shouldNotImplement が initialize.
2 つの小さなこと:
- クラス名は Smalltalk では大文字で表記されるため、abst ではなく Abst になります。
- グーグル検索は大いに役立ちます。「smalltalk 抽象クラス」の上位 4 つのリンクのうち 3 つだけで十分でした (特にこれは適切に見えました)。
更新:クラスのユーザーにインスタンスを作成してはならないことを通知したい場合(以下のコメントのように)、次のように書くことができます:
Abstract>>new
^ self subclassResponsibility.
すると「Abstract new」→エラーですが、「AbstractSubclass new」でOKです。
AbstractSubclass が抽象メソッドをオーバーライドしたという保証はまだありませんが (#new ではありませんが、そもそもインスタンス化を防止したい原因となったものです)、実際にはこれは問題になりません。本当に必要な場合は、おそらく #initialize にチェックを入れて、インスタンスのメソッドが #subclassResponsibility を呼び出さないようにすることができますが、正当な理由がない限り気にしないでください。
更新 2: クラスを抽象化するためのユーティリティ メソッドは次のようになります。
Class>>makeAbstract
self class compile: 'new
^ self subclassResponsibility'.