Aby tu nebylo jen pusté filosofování, zde je "protocol-oriented" kód (ať to není příliš dlouhé, tak jen pro nejobecnější a nejspeciálnější případ):
protocol QuadrilateralWithParallelOppositeSides {
var side1:Double { get }
var side2:Double { get }
var skew:Double { get }
}
extension QuadrilateralWithParallelOppositeSides {
func area() -> Double {
return side1 * side2 * cos(skew)
}
}
struct Parallelogram : QuadrilateralWithParallelOppositeSides {
var side1:Double
var side2:Double
var skew:Double
init(side1 s1:Double, side2 s2:Double, skew s:Double) {
side1 = s1
side2 = s2
skew = s
}
}
struct Square : QuadrilateralWithParallelOppositeSides {
var side1:Double
var side2:Double { return side1 }
var skew:Double { return 0 }
init(side s1:Double) {
side1 = s1
}
}
let figure1 = Parallelogram(side1: 2, side2: 3, skew: M_PI_4)
let figure2 = Square(side: 3)
var list:Array<QuadrilateralWithParallelOppositeSides> = [ figure1, figure2 ]
print(list.map { $0.area() })
Jak je hezky vidět, metoda pro výpočet obsahu se definuje jen jednou. O různé invarianty se postarají "computed properties". Jednoduché, elegantní a rozšiřitelné