- built-in classes には、subclassをつくることができない。
DEFCLASS
- DEFSTRUCTは、backward compatibilityのためにあるといってよい。
Slot Specifiers
- slotsがだぶっていた場合は、unionになるんだ。その合併ルールはなんだろ。
Object Initialization
特になし。
Accessor Functions
SETFのところが、すっと入らないのでメモ。
- a SETF function は、SETF(macro)を拡張するひとつの方法。
- "The name of a SETF function is a two-item list ...)" ここが理解できない。。。
SETF functionはDEFUNで定義するもんなんだから、その作りをどうしようが作り手の勝手ではないか?
後段ででてくるDEFCLASSが自動的に作るものの説明とごっちゃになっているような気がする。
WITH-SLOTS and WITH-ACCESSORS
Class-Allocated Slots
Slots and Inheritance
特になし。
Multiple Inheritance
ここもメモをとりながら。
- 複数のdirect superclassesをもてることは、the effective methodの構築とslot specifiersのマージを複雑にする。
- DEFCLASSのdirect superclass listにて、左側のsuperclass程、more specificであるというルール。
- それにしたがって、a linear class precedence listをつくる。class precedence listは、そのclassから見たとき、というものである。classの統一的な系統図ではない。あくまでそのclassから見た優先リストということ。
- the same generic functionについて、複数のsuperclassで定義されているときにclass precedence listは役に立つ。
- 例えば、
(defclass money-market-account (checking-account savings-account) ())
(money-market-account
checking-account
savings-account
bank-account
standard-object
t)
という状況にて、print-statementというジェネリック関数がcheck...とsaiving...の双方に定義されている場合。 - 何もしないと、money-market-accountのprint-statementは、check...のものになる。ここれ class precedence listが使われている。
- money-market-accountのprint-statementの振舞を変更するにはいろいろなやり方がある。
- ひとつめ。money-markege-account用に、print-statementを書く。
この方法の場合、check...はCALL-NEXT-METHODで呼べるが、saving...のとかを呼ぶ方法はない。そのコードを使おうと思ったら、saving...の内容を別関数にしておかねばならない。 - ふたつめ。print-statementは全部CALL-NEXT-METHODにしておく。そうすると、money-market-accoutから見たclass precedence listでは、check...とsaving...が上のように並ぶので、両方呼ばれる。ただし、これはCALL-NEXT-METHODを書いときましょう、というコーディング規約の遵守が必要となる。
- みっつめ。補助メソッドを使う。bank-account に対して、print-statementをprimaryとして定義する。check...とsaving...については、auxiliary(:after)としてそれぞれの処理を定義しておく。すると、money...に対するとprint-statementの呼び出しは、これら全てを実行する。
Good Object-Oriented Design
そうか、OO設計を学ぶには6ヶ月は覚悟が必要、なのか。
ただ、OOの本ってJavaで書かれているものが多いから、そのまえにJavaを読めるくらいになっとかないといけないかも。それも数ヶ月はかかりそう。無理かも。
0 件のコメント:
コメントを投稿