[Kotlin] 11. 上書きと抽象化



サブクラスにスーパークラスと同じ名前の関数を持つことはできません.
fun main() {
    var t = Tiger()
    t.eat()
    
}

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

class Tiger: Animal() {
    fun eat() {
        println("고기를 먹습니다.")
    }
}

eatスーパークラスAnimalで使用中にエラーが発生しました.ただし,上書きによりサブクラスで再実現できる.

1.誇張


1-1. に火をつける

  • スーパークラスが許可されている場合、サブクラスに同じ形式の関数を作成できます.
  • 、すなわちサブクラスからスーパークラスを再定義する方法.
  • openキーワードを使用してoverridingを行います.
  • サブクラスでは、overrideキーワードを使用してoverridingを行うことができます.
  • fun main() {
        var t = Tiger()
        
        t.eat()
    }
    
    open class Animal{
        fun eat() { 
            println("음식을 먹습니다.")
        }
    }
    
    class Tiger : Animal()
    
    // 결과
    음식을 먹습니다.

    fun main() {
        var t = Tiger()
        
        t.eat()
    }
    
    open class Animal{
        open fun eat() { 
            println("음식을 먹습니다.")
        }
    }
    
    class Tiger : Animal() {
        override fun eat() {
            println("고기를 먹습니다.")
        }
    }
    
    // 결과
    고기를 먹습니다.
    スーパークラスにopenを追加する関数は、サブクラスにoverrideを追加することで再実現できます.
    オーバーライドは、サブクラスでスーパークラスで完了した関数を再実装します.
    次に学習するのは、スーパークラスには関数の具体的な実装はありませんが、スーパークラスの「すべてのサブクラスが関数を実装する必要があります.」抽象(abstraction)を見てみましょう.各サブクラスが必要に応じて空の関数の内容を実現できるように宣言する方法です.

    2.抽象化抽象化

  • 宣言のみで、機能のない抽象関数(抽象関数)
  • 抽象関数を含む抽象クラス
  • 抽象には以上の2種類がある.
  • 2-1. ちゅうしょうかんすう

  • 抽象クラスは抽象キーワードを使用します.
  • インスタンスを作成できません.
  • 抽象関数は抽象キーワードを使用します.
  • 実施簿に記入しない.
  • fun main() {
    	 	var r = Rabbit()   
        
        r.eat()
        r.sniff()
    }
    
    abstract class Animal { // 추상클래스는 인스턴스를 만들 수 없다.
        abstract fun eat() // 추상함수는 구현하지 않는다.
        fun sniff() {
            println("킁킁")
        }
    }
    
    class Rabbit : Animal() {
        override fun eat() {
            println("당근을 먹습니다.")
        }
    }
    抽象化のもう一つの方法:インタフェースを理解します.

    2-2. インタフェース

  • の既存の古典言語では、抽象関数のみからなるクラスを指す.→「純粋抽象化機能」
  • しかし、コトリンでは属性、抽象関数、および一般関数を同時に有することができる.
  • 抽象クラスはジェネレータを有することができるが、インタフェースはジェネレータを有することができない.
  • インタフェースキーワードを使用して宣言します.
  • インタフェースの関数

  • は、実施部の関数→オープン関数
  • を含む.
  • 実施部のない関数→抽象関数
  • では、個々のキーワードがなくても、すべての関数をサブクラスで実装および再定義できます.
  • は一度に複数のインタフェース(複数の中高速)を継承し、
  • を柔軟に設計することができる.

    例。

    fun main() {
        var d = Dog() 
        
        d.run()
        d.eat()
    }
    
    interface Runner {
        fun run()
    }
    
    interface Eater {
        fun eat() {
            println("음식을 먹습니다.")
        }
    }
    
    class Dog : Runner, Eater { // 두 인터페이스를 상속받으려면 표기만 해주면 된다.
        override fun run() {
            println("우다다다 뜁니다.")
        }
        override fun eat() {
            println("허겁지겁 먹습니다.")
    	}
    }
  • インタフェースはクラスではないので、継承時に()を呼び出してジェネレータを呼び出すのではなく、名前だけを書きます.
  • 注意事項。


    同じ名前とシェイプを持つ関数を複数のインタフェースまたはクラスで実装する場合は、サブクラスでの混同を回避するために、オーバーライドによって再実装する必要があります.

    複数の継承時に同じ名前の関数。

    fun main() {
        var p = Person()
    
        p.breath()
    }
    
    interface Runner {
        fun breath() {
            println("숨을 하우하후 쉽니다.")
        }
    }
    
    interface Eater {
        fun breath() {
            println("숨을 후하후하 쉽니다.")
        }
    }
    
    class Person : Runner, Eater {
        override fun breath() {
            super<Eater>.breath()
            super<Runner>.breath()
        }
    }
  • スーパークラス名を先端の間に配置し、superが呼び出すメソッドのタイプを指定できるようにします.
  • 整理する

  • 過負荷
  • サブクラスで再定義(再実装、変更)完了した関数機能
  • 抽象
  • 形式のみが宣言され、実際にはサブクラス
  • が実装されている.
  • インタフェース
  • は、複数の異なる機能を継承するのに役立ちます.