2014年10月29日
Posted by 屋台ブルー at
2014年10月29日00:00 Comment(0)
Swiftで遊ぼう! - 110 - Swift Fundamentals本 クラスとサブクラス
z「Swift Fundamentals: The Language of iOS Development - スイフト:基本」はまだまだ続く。
今日のテーマはサブクラスと関数のオーバーライド。
さあ、私のようにOOPの勉強を3ヶ月もした人間にとって、この内容は難しくないのだが、まだまだOOPのトレーニングができていないので、実践的に使えない。
「オブジェクト指向でなぜつくるのか 第2版」この本に書かれていたクラスの特徴をもう一度説明しよう。
Swiftで遊ぼう! - 73 オブジェクト指向でなぜつくるのか 第2版で説明しているが、クラスの特徴は3つ。
1. クラス
2. 継承
3. ポリモーフィズム(多様性)
この3つだ。これを復習する必要がある。
まず、「クラス」の考え方だが、基本的に重要なのがプロパティはローカル扱いで外には見えず中だけでカプセル化するということ。インスタンスをいくらでも必要なだけ作ることができるのもクラスの特徴である。
そしてこれを「継承」できるのがクラスの重要な機能の一つ。クラスを継承させる時の考え方は、素人の私のような人間が最初に思い浮かべるのが、ベースになるクラスを考え、それを継承させるサブクラスを作っていく流れが自然なような気がする。しかし、実際はベースから考えるのではなく、ここの章でも示しているように、Carクラスを考え、それに似たTruckクラスを作ったとき、共通する部分としてVehicleクラスを作るという考えが自然な流れのようだ。サブクラスが、「継承」という概念を実現したものと考えていいのだろう。これであっているのだろうか?
ベースクラスの抽出という考え方は、少し視点を変えれば、ポリモーフィズムという考え方にもなりますね。いわゆる「共通メインルーチン」を抽出するという考え方です。実は、明日以降に説明する「プロトコール」が、このポリモーフィズムの実装ということになる。Swiftでは「プロトコール」ですが、他の言語で「インターフェイス」と呼ぶようだ。
サブクラスの説明を以下のようにしていた。
class Vehicle {
var maxSpeed: Double
var currentSpeed = 0.0
var make: String
init(maxSpeed: Double, make: String) {
self.maxSpeed = maxSpeed
self.make = make
}
func getSpeed() -> Double {
return maxSpeed
}
func getMake() -> String {
return make
}
func makeNoise() {
}
}
class Car: Vehicle {
override func makeNoise() {
println("Honk")
}
func accelerate() {
println("Accelerating")
}
}
class AMbulance: Vehicle {
override func makeNoise() {
println("WAAAAAHHHHHHH!")
}
}
let aCar = Car(maxSpeed: 75, make: "Jeep")
let anAmbu = AMbulance(maxSpeed: 105, make: "Ambulance Company")
aCar.getSpeed()
aCar.makeNoise() //Honk
anAmbu.makeNoise() //WAAAAAHHHHHHH!
同じ関数なのに多様性が与えられているということで、この関数「makeNoise()」はプロトコール的な実装のしかただと思います
じゃあ簡単に章末の問題を解こう
Questions for Review - 復習のための質問
1. 親クラスと全く関連性のないサブクラスを持つことが有用性がある。
a) 正しい
b) 間違い
これは当然(b)の間違いですね。
2. サブクラスを適切に宣言するシンタックスは次のどれですか?
a) subclass mySubclass { // subclass code block }
b) subclass mySubclass: myClass { // subclass code block }
c) class mySubclass: myClass { // subclass code block }
d) class mySubcass inherits myClass { // subclass code block }
これは(c)が正解です。
3. オーバーライド(override)を使うと親クラスのメソッドと異なるメソッドとサブクラスに組み込むことができる
a) 正しい
b) 間違い
これは(a)で正しい。
4. オブジェクト指向プログラミングの1つの利点は何ですか?
a) 大きなプログラムの中で組織化され構造化することができる
b) 印象的なイメージを与える
c) 一覧性を与えることで関数を系統立てることができサブクラス化した定数や変数を埋め込むことができる。
d) 何も利点がない
これは(a)ですね。
今日はここまで。
今日のテーマはサブクラスと関数のオーバーライド。
さあ、私のようにOOPの勉強を3ヶ月もした人間にとって、この内容は難しくないのだが、まだまだOOPのトレーニングができていないので、実践的に使えない。
「オブジェクト指向でなぜつくるのか 第2版」この本に書かれていたクラスの特徴をもう一度説明しよう。
Swiftで遊ぼう! - 73 オブジェクト指向でなぜつくるのか 第2版で説明しているが、クラスの特徴は3つ。
1. クラス
2. 継承
3. ポリモーフィズム(多様性)
この3つだ。これを復習する必要がある。
まず、「クラス」の考え方だが、基本的に重要なのがプロパティはローカル扱いで外には見えず中だけでカプセル化するということ。インスタンスをいくらでも必要なだけ作ることができるのもクラスの特徴である。
そしてこれを「継承」できるのがクラスの重要な機能の一つ。クラスを継承させる時の考え方は、素人の私のような人間が最初に思い浮かべるのが、ベースになるクラスを考え、それを継承させるサブクラスを作っていく流れが自然なような気がする。しかし、実際はベースから考えるのではなく、ここの章でも示しているように、Carクラスを考え、それに似たTruckクラスを作ったとき、共通する部分としてVehicleクラスを作るという考えが自然な流れのようだ。サブクラスが、「継承」という概念を実現したものと考えていいのだろう。これであっているのだろうか?
ベースクラスの抽出という考え方は、少し視点を変えれば、ポリモーフィズムという考え方にもなりますね。いわゆる「共通メインルーチン」を抽出するという考え方です。実は、明日以降に説明する「プロトコール」が、このポリモーフィズムの実装ということになる。Swiftでは「プロトコール」ですが、他の言語で「インターフェイス」と呼ぶようだ。
サブクラスの説明を以下のようにしていた。
class Vehicle {
var maxSpeed: Double
var currentSpeed = 0.0
var make: String
init(maxSpeed: Double, make: String) {
self.maxSpeed = maxSpeed
self.make = make
}
func getSpeed() -> Double {
return maxSpeed
}
func getMake() -> String {
return make
}
func makeNoise() {
}
}
class Car: Vehicle {
override func makeNoise() {
println("Honk")
}
func accelerate() {
println("Accelerating")
}
}
class AMbulance: Vehicle {
override func makeNoise() {
println("WAAAAAHHHHHHH!")
}
}
let aCar = Car(maxSpeed: 75, make: "Jeep")
let anAmbu = AMbulance(maxSpeed: 105, make: "Ambulance Company")
aCar.getSpeed()
aCar.makeNoise() //Honk
anAmbu.makeNoise() //WAAAAAHHHHHHH!
同じ関数なのに多様性が与えられているということで、この関数「makeNoise()」はプロトコール的な実装のしかただと思います
じゃあ簡単に章末の問題を解こう
Questions for Review - 復習のための質問
1. 親クラスと全く関連性のないサブクラスを持つことが有用性がある。
a) 正しい
b) 間違い
これは当然(b)の間違いですね。
2. サブクラスを適切に宣言するシンタックスは次のどれですか?
a) subclass mySubclass { // subclass code block }
b) subclass mySubclass: myClass { // subclass code block }
c) class mySubclass: myClass { // subclass code block }
d) class mySubcass inherits myClass { // subclass code block }
これは(c)が正解です。
3. オーバーライド(override)を使うと親クラスのメソッドと異なるメソッドとサブクラスに組み込むことができる
a) 正しい
b) 間違い
これは(a)で正しい。
4. オブジェクト指向プログラミングの1つの利点は何ですか?
a) 大きなプログラムの中で組織化され構造化することができる
b) 印象的なイメージを与える
c) 一覧性を与えることで関数を系統立てることができサブクラス化した定数や変数を埋め込むことができる。
d) 何も利点がない
これは(a)ですね。
今日はここまで。