テンプレートパターン
- アルゴリズムの骨組みを決めておき、実装はそれを継承したクラスで行う
- 細かい実装を気にせず、protocolで呼び出しできるメリットが有る
前提
- JapaneseManとEnglishManという2つのクラスがある
- sayHelloというメソッドがあり、挨拶をそれぞれの国の言葉でできる
class JapaneseMan {
func sayHello() -> String {
return "こんにちは" // 日本語で返す
}
}
class EnglishMan {
func sayHello() -> String {
return "Hello" // 英語で返す
}
}
問題
- 似たような関数であるsayHelloを使うのに、classが違うため、面倒
- たとえ話ですが、arrayに無理やり入れようとするとAnyとなる
- AnyではsayHelloを呼び出すことはできず、一度キャストする必要が出てくる
let peopleArray = [JapaneseMan, englishMan] as [Any]
peopleArray[0] // <- このときanyになる
テンプレートパターン
- protocolで予め骨組みを作成し、各クラスで継承し、実装する
- 配列で使うときなどはprotocolを指定して受け皿を作成し、利用する
- こうすることで実装は気にせず、オブジェクトを抽象的に扱うことができる
protocol Greetings {
func sayHello() -> String
}
extension JapaneseMan: Greetings {
func sayHello() -> String {
return "こんにちは" // 日本語で返す
}
}
extension EnglishMan: Greetings {
func sayHello() -> String {
return "Hello" // 英語で返す
}
}
let greetingsArray: [Greetings] = [japaneseMan, englishMan]
greetingsArray[0] // <- このときGreetingsになる
greetingsArray[0].sayHello()
greetingsArray[1].sayHello()