まず継承を検討する。
Dollarを親とし、Fracを子クラスにすると考えた。
しかし、実際はこれはコードを削減にはつながらない。
(てか個人的にはむしろこの発想がやべぇ。普通しない)
次にMoneyという親クラスを検討する。
これは少し時間がかかるが、非常にうまくいく。
なお、SwiftにはJavaのprotectedのようなものはない!!!
(aaaaa!罪を贖えぬ!!!!!
本書には共通メソッド、共通プロパティ親クラスに移す手順が書かれている。
コピペしているわけだから、共通プロパティはamount、メソッドはequalメソッドとすぐわかる。
ちょっとjavaと書き方変わるけど,swiftだとこんな感じですかね。
playground.swift
var moneytest = MoneyTest()
moneytest.TestMultiplication()
moneytest.TestEquality()
moneytest.TestFrancMultiplication()
class MoneyTest{
init(){}
func TestMultiplication(){
var five = Dollar(5)
assert(Dollar(10) == five.times(2))
assert(Dollar(15) == five.times(3))
}
func TestEquality(){
assert(Dollar(5) == Dollar(5))
assert(Dollar(6) == Dollar(6))
assert(Franc(5) == Franc(5))
assert(Franc(6) == Franc(6))
}
func TestFrancMultiplication(){
var five = Franc(5)
assert(Franc(10) == five.times(2))
assert(Franc(15) == five.times(3))
}
}
///親クラス
class Money :Equatable{
var amount:Int
init(_ amount:Int){
self.amount = amount
}
static func == (lhs: Money, rhs: Money) -> Bool {
return lhs.amount == rhs.amount
}
}
///Dollar子クラス
class Dollar:Money {
override init(_ amount:Int){
super.init(_ :amount)
self.amount = amount
}
func times(_ multiplire:Int) -> Dollar{
return Dollar(amount * multiplire)
}
}
///Franc子クラス
class Franc:Money {
override init(_ amount:Int){
super.init(_ :amount)
self.amount = amount
}
func times(_ multiplire:Int) -> Franc{
return Franc(amount * multiplire)
}
}