>>560 続き [>>391の 1(a)]

"ドアにドアストッパーを設置(traitを使用)"
bドア := aドア as: ドア newSubclass.
bドア class rename: #ストッパー付きドア.
bドア addInstanceVarNamed: #ストッパー withValue: #解除.
ストッパー付きドア compile: 'ストッパー ^ストッパー'.
ストッパー付きドア compile: 'ストッパー: 固定か解除 ストッパー := 固定か解除'.
"bドア ストッパー: #解除 => compile error: Private messages may only be sent to self"

Trait named: #Tドアストッパー uses: #() category: 'UserObjects'.
Tドアストッパー compile: 'ストッパーを外す self ストッパー: #解除'.
Tドアストッパー compile: 'ストッパーをかける self ストッパー: #固定'.
Tドアストッパー compile: 'ストッパーかかっている? ^self ストッパー == #固定'.
Tドアストッパー compile: '押す self ストッパーを外す. super 押す'.
Tドアストッパー compile: '引く self ストッパーかかっている? ifFalse: [super 引く]'.
ストッパー付きドア uses: Tドアストッパー.


bドア ノブ 回す. bドア 押す; 開いている?. "=> true "
bドア ストッパーをかける; 引く; 閉じている?. "=> false "
bドア ストッパーを外す; 引く; 閉じている?. "=> true "
bドア ノブ 回す. bドア 押す; 開いている?. "=> true "
bドア ストッパーをかける; 引く; 閉じている?. "=> false "
bドア 押す; 引く; 閉じている?. "=> true "