10.誇張と抽象


この記事はYouTubeレッスン「Demo Cottlin」を見てまとめたものです.
https://www.youtube.com/playlist?list=PLQdnHjXZyYadiw5aV3p6DwUdXV2bZuhlN
講座を見たい人は上のリンクで勉強できます.

オーバーライド(Override)


オーバーライドとは、親クラスで作成された関数(fun)です.
サブクラスでの再定義を許可します.(スーパー(親)クラスを許可)
コードを見て理解しましょう.
fun main() {
    val t = Tiger()
    t.eat()
}

open class Animal {
    fun eat() {
        println("음식을 먹습니다.")
    }    
}

class Tiger : Animal()
結果:
食べ物を食べる.
Tigerクラスでeat()関数を再定義したいのですが、スーパー(親)クラスで定義されています.
でも!
Openを使用して親fun関数を開きます.
サブクラスで書き換えが許可されている場合は?
fun main() {
    val t = Tiger()
    t.eat()
}

open class Animal {
    open fun eat() {
        println("음식을 먹습니다.")
    }    
}

class Tiger : Animal(){
    override fun eat(){
        println("고기를 먹습니다.")
    }
}
結果:
私は肉を食べます.
  • 要約:親で関数を開き、子で上書きを使用して再定義できます.
  • 抽象


    上の上書きの場合、親はA関数を作成し、関数の内容を構成します.
    これは子供が必要に応じてA関数を再定義する場合です.
    この場合、親はA関数を作成し、その内容は空(ハウジングのみ)です.
    「子にはA関数が必要」という点が親で明示されている場合.
    各サブクラスは、必要に応じて空の関数を実装する内容を抽象と呼ぶ.
    コードを見て理解しよう
    fun main() {
        var r = Rabbit()
        r.eat()
        r.sniff()
    }
    
    // 추상 클래스
    abstract class Animal {
        
        // 추상 함수
        abstract fun eat() 
        
        // 일반 함수
        fun sniff() {
            println("킁킁")
        }
    }
    
    // Animal 추상클래스를 상속받은 Rabbit 클래스
    class Rabbit : Animal() {
        // 추상함수 eat()를 정의
        override fun eat(){
            println("당근을 먹습니다.")
        }
    }
    結果:
    ニンジンを食べる.
    ふんふん
    このようにabstractを追加した抽象クラスは未完了であるため、インスタンスを単独で作成することはできません.
    したがって,実装を完了するためにサブクラスから継承する必要がある.

    インタフェース


    上記の場合,abstractclassを用いて抽象化した.
    インタフェースを利用する方法もあります.
    コトリンではインタフェース

    •プロパティ
    •抽象関数
    •一般的な関数
    すべての人を持つことができます.
    しかし、抽象関数はジェネレータを有することができる.
    インタフェースにジェネレータを持つことはできません.
    また、インタフェースの内容は「関数を内部で実装するかどうか」に依存します.

    最後に、複数のインタフェースを一度に継承することで、設計をより柔軟にすることができます.

    コードを見て理解しよう
    fun main() {
        var d = Dog()
        d.run()
        d.eat()
    }
    
    // Runner 인터페이스
    interface Runner{
        // 추상함수
        fun run()
    }
    // Eater 인터페이스
    interface Eater{
        // 일반함수
        fun eat() {
            println("음식을 먹습니다.")
        }
    }
    
    // 인터페이스 2개를 상속받은 Dog 클래스
    class Dog : Runner, Eater {
        // 추상함수 재정의
        override fun run(){
            println("우다다다 뜁니다.")
        }
        // 일반함수 재정의
        override fun eat(){
            println("허겁지겁 먹습니다.")
        }
    }
    結果:
    ブーブーと踊りそうになった
    むしゃむしゃ食べる.
    まとめてみると、
    1.上書き:子の再定義に使用される実装が完了した親関数.
    2.抽象クラス:親の内容が空の関数で、子によって定義されます.
    3.インタフェース:複数の異なる機能が必要な場合に使用します.