はじめに
前回のオーバーライドに引き続き、続編という形で継承について簡単にまとめる。
継承詳細
- 継承とは、親クラスの属性を引き継いで、新たなクラス(子クラス)を作ることである。
- 継承「される」クラスを親クラス or スーパークラスと言い、継承「する」クラスを子クラス or サブクラスという。
- 親クラスで定義したプロパティやメソッドは子クラスで自動的に呼び出せる(インスタンス化時も同様)
- 定義の仕方 class 子クラス名: 親クラス名{}
Swift
//親クラス定義
class People {
var name: String
var age: Int
init(name: String, age: Int = 10) {
self.name = name
self.age = age
}
func printStatus() {
print("名前:\(name),年齢:\(age)")
}
//引数の型にこのクラスのPeopleを指定
func greetPeople(other: People) {
//ここでprintする引数otherは型として親クラスPeopleを継承しているため、Peopleに定義されているプロパティを参照できる
print("\(name)は\(other.name)に挨拶をした。")
}
}
//子クラス定義(Peopleクラスが親クラス)1
class Kotarou: People {
//ここのオーバーライドで定義するinitは親クラスPeopleで定義したinitのこと。また、overridesしたinit(name: String, age: Int = 10)各々の引数の型は変更できない。
override init(name: String, age: Int = 10) {
//superを付けることで親クラスのinit(name: String, age: Int = 10)を呼び出した。
//また、継承しているため、ageを指定しなくとも、ageはインスタンス化時に出力される。
super.init(name: name)
}
}
//子クラス定義(Peopleクラスが親クラス)2
class Tarou: People {
//ここのオーバーライドで定義するinitは親クラスPeopleで定義したinitのこと
//init(name: String, age: Int)の引数ageのデフォルト値を削除した。また、overridesしたinit(name: String, age: Int = 10)各々の引数の型は変更できない。
override init(name: String, age: Int) {
//superを付けることで親クラスのinit(name: String, age: Int = 10)を呼び出した。
super.init(name: name, age: age)
}
}
//親クラスのインスタンス化
//もちろん親クラスは通常通りinitでプロパティの値を初期化できる
let people = People(name: "勇気", age: 15)
//子クラスのインスタンス化1
let kotarou = Kotarou(name: "小太郎")
//子クラスのインスタンス化2
let tarou = Tarou(name: "太郎", age: 10)
//各々メソッドにアクセス
people.printStatus() //名前:勇気,年齢:15
//greetPeople()の引数otherの型はPeople型であるため、People型の値を入れる必要あり
people.greetPeople(other: tarou) //勇気は太郎に挨拶をした。
kotarou.printStatus() //名前:小太郎,年齢:10
tarou.printStatus() //名前:太郎,年齢:10
}
おわりに
補足事項・ご指摘ある方はぜひコメントにてご指摘ください。
参考記事
開発環境
- Xcode-13.4.1
- iOS13以降