[Kotlin]Kotlin OOP(3)-演算子過負荷、委任


演算子のオーバーロード
  • この演算子+、-、*、/および%を再ロードできます.
  • オーバーロード時演算子名プラス、マイナス、次、div、rem
  • 単項演算子
  • unaryPlus, unaryMinus, not, inc, dec
  • 比較演算子
  • equals, compareTo
  • ソース例:許俊英教授github
    data class Complex(val real: Double, val img: Double) {
        operator fun plus(other: Complex): Complex
            = Complex(real + other.real, img + other.img)
        override fun toString(): String = "$real+${img}i"
    }
    
    operator fun Complex.minus(other: Complex): Complex
        = Complex(real - other.real, img - other.img)
    
    fun main() {
        val c1 = Complex(1.0, 1.0)
        val c2 = Complex(2.0, 2.0)
        val c3 = c1 + c2
        println(c3) // 3.0 + 3.0i
        println(c3 == Complex(3.0, 3.0)) // true
    }
    委任する
  • 継承と似ていますが、異なります.
  • 継承は強合併、委任は弱合併
  • 継承不可または委任可能
  • 委任するクラスと同じインタフェースを実装する必要があります
  • 委任モードは、委任(継承)するオブジェクトをメンバーとして作成し、特定のメソッドを呼び出すときに委任オブジェクトを呼び出す方法で転送(呼び出す)することによって作成されます.
  • 代理オブジェクトの各メソッドについて、
  • を転送するための新しいメソッドを作成します.
  • byキーワードに委任
  • ソース例:許俊英教授github
    interface Base {
        fun print()
        fun printHello()
    }
    
    class BaseImpl(val x: Int) : Base {
        override fun print() { print(x) }
        override fun printHello() { println("Hello")}
    }
    
    class Derived(val b: Base) : Base by b {
        override fun print() {
            b.print()
            println("ok")
        }
    }
    
    // fun main() { // kts에서 작성
    val b = BaseImpl(10)
    val d = Derived(b)
    d.print() // 10ok
    d.printHello() // Hello // Derived 에서 구현하지 않았으나 b의 것을 사용
    // }
    参考資料
  • https://kotlinlang.org/docs/delegation.html#overriding-a-member-of-an-interface-implemented-by-delegation
  • https://github.com/jyheo/kotlin-tutorial/blob/master/kotlin-OOP.md