継承
- 継承とオーバーライドを可能にするには、open修飾子を使う必要がある
- メソッドをオーバーライドするにはoverrideを使う
- オーバーライドを強制するためには抽象クラスと抽象メソッドを用いる
抽象メソッドとは派生クラスでのオーバーライドを強制するメソッドのこと
抽象クラスとは抽象メソッドを定義できるクラスのこと
open class Person (var lastName: String, var fistName: String, var age: Int) {
open fun introduction() {
println("Name ${fistName} ${lastName}です。${age}さい")
}
}
class BusinessPerson(lastName: String, fistName: String, age: Int, var CompanyName: String) : Person (lastName, fistName, age) {
override fun introduction() {
super.introduction()
println("会社は ${CompanyName} です")
}
fun addWorkDaysCount(currentDays: Int): Int {
return currentDays + 1
}
}
fun main() {
val user = BusinessPerson("山田","太郎", 20,"ホゲホゲ会社")
user.introduction()
println("出勤日数は${user.addWorkDaysCount(10)}日目です")
}
抽象クラス
- クラスとそのメンバは abstract を使用して抽象クラス・抽象メンバとして宣言することができます。抽象メンバはそのクラス内に実装を持ちません。抽象クラスや抽象関数にopenアノテーションを付ける必要はないことに注意してください。もっとも、それは言うまでもないことですが。
abstract class Person (var lastName: String, var fistName: String, var age: Int) {
abstract fun introduction()
}
class BusinessPerson(lastName: String, fistName: String, age: Int, var CompanyName: String) : Person (lastName, fistName, age) {
override fun introduction() {
println("Name ${fistName} ${lastName}です。${age}さい")
println("会社は ${CompanyName} です")
}
fun addWorkDaysCount(currentDays: Int): Int {
return currentDays + 1
}
}
fun main() {
val user = BusinessPerson("山田","太郎", 20,"ホゲホゲ会社")
user.introduction()
println("出勤日数は${user.addWorkDaysCount(10)}日目です")
}
ルールのオーバーライド
open class A {
open fun f() { print("A") }
fun a() { print("a") }
}
interface B {
fun f() { print("B") } // インタフェースのメンバはデフォルトで'open'
fun b() { print("b") }
}
class C() : A(), B {
// オーバライドするためにコンパイラは f() を要求する
override fun f() {
super<A>.f() // A.f()の呼び出し
super<B>.f() // B.f()の呼び出し
}
}
fun main() {
var c = C()
c.f()
}