Object extend [ as: similarClass [ ^similarClass newFrom: self ] ]
Object subclass: PrimePrice [
| value |
value [ ^value ]
value: newValue [ value := newValue ]
]
PrimePrice class extend [
value: value [ ^self new value: value; yourself ]
]
Object subclass: MarginPrice [
| originalPrice |
setOriginalPrice: price [ originalPrice := price ]
value: newValue [ originalPrice value: newValue ]
]
MarginPrice class extend [
newFrom: price [ ^self new setOriginalPrice: price; yourself ]
]
MarginPrice subclass: DoublePrice [ value [ ^originalPrice value * 2 ] ]
MarginPrice subclass: WholesalePrice [
| advantage |
value [ ^originalPrice value + advantage ]
advantage: newAdvantage [ advantage := newAdvantage ]
]
| price |
price := ((((((PrimePrice value: 120)
as: DoublePrice)
as: WholesalePrice) advantage: 80)
as: DoublePrice)
as: WholesalePrice) advantage: 200.
price value displayNl.
(price value: 100; value) displayNl