フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

kotlin覚えたメモ⑤(継承)

継承

  • 継承とオーバーライドを可能にするには、​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()
}