[コートリン]open,final,abstract変更者


デフォルトではfinal


この本では、「継承された設計とドキュメントを持ち、できない場合は継承を禁止する」と提案されています.これは、サブクラスに特にクラスとメソッドを上書きしない場合、finalがすべて作成されることを意味します.
コトリンも同じ哲学に従っている.デフォルトではJavaのクラスとメソッドは継承で開きますが、デフォルトではコトリンのクラスとメソッドはfinalです.すなわち、変更者なしでクラスが宣言された場合、そのクラスはfinalに継承されません.

変更者を開く


したがって、クラスの継承を許可するには、クラスの前にOpen変更子を付ける必要があります.また、オーバーシュートを許可する方法またはプロシージャの前に、[開く](Open)変更者を追加する必要があります.
interface Clickable {
    fun click()
}

// open 변경자를 사용하여 이 클래스는 열려 있습니다. 다른 클래스가 이 클래스를 상속할 수 있습니다.
open class RichButton : Clickable {
    // 이 함수는 파이널입니다. 다른 클래스가 이 메서드를 오버라이드 할 수 없습니다.
    fun disable() {}

    // open을 사용하여 이 함수는 열려있습니다.
    // 하위 클래스에서 이 메서드를 오버라이드해도 됩니다.
    open fun animate() {}
    
    // 이 함수는 (상위 클래스에 선언된) 열려있는 메소드를 오버라이드합니다.
    // 오버라이드한 메서드는 기본적으로 열려있습니다.
    override fun click() {}
}

  • disable():クラスにopen変更子を追加したが、メソッドでopenが宣言されていない場合、サブクラスはメソッドを上書きできません.

  • animate():メソッドにopenを追加することで、サブクラスでメソッドを上書きできます.

  • click():宣言されたメソッドはインタフェースを超えていますが、デフォルトではopenが宣言されていない場合でも、スーパーコールメソッドが開いているため、サブクラスでスーパーコールメソッドを再上書きできます.
    サブクラスで過剰なメソッドを実装したくない場合は、過剰なメソッドの前にfinalを指定する必要があります.
  • 抽象変更者


    コトリンではJavaのようにabstractと宣言することもできます.abstractとして宣言された抽象クラスをインスタンス化できません.抽象クラスに実装されていない抽象メンバーがあるため、通常はサブクラスで抽象メンバーを上書きする必要があります.抽象メンバーは常に開いているため、抽象メンバーの前で開いている変更者を宣言する必要はありません.
    // abstract 변경자를 사용하여 이 클래스는 추상 클래스
    // 인스턴스 만들 수 없다
    abstract class Animated {
        // 이 함수는 추상 함수
        // 하위 클래스에서 이 함수를 반드시 오버라이드 해야함
        abstract fun animate()
    
        // 추상 클래스에 속해도 비추상 함수는 기본적으로 파이널이지만
        // 원한다면 open으로 오버라이드를 허용함
        open fun stopAnimating() {
            println("Stop animating~~")
        }
    
        // 파이널 함수(오버라이드 못함)
        fun animateTwice() {
            println("Animate twice~~~")
        }
    }

  • animate():抽象的な変更者がいるため、クラスはサブクラスで上書きする必要があります.

  • stopAnimating():openが含まれているため、サブクラスを超えることができる実装された関数です.

  • animateTwice():実装された関数で、デフォルトではfinalであり、サブクラスで上書きできません.
  • 整理する


    変更者この変更者に追加されたメンバーは、finalがクラスメンバーのデフォルト変更者(何も宣言されていない)oepnを上書きするにはopenを指定する必要があります.abstractは上書きする必要があります.この変更者を抽象クラスのメンバーに貼り付けるしかありません.抽象メンバーは体現できない.親または親インスタンスのメンバーを上書きする場合、上書きされたメンバーはデフォルトで開きます.finalを指定してサブクラスのオーバーライドを禁止
    上記の表はクラスメンバーに適用できますが、インタフェースメンバーではfinal、open、abstractは使用されません.インタフェースメンバーは常に開いており、finalに変更できません.インタフェースメンバーに本文がない場合、抽象メンバーになりますが、メンバー宣言前にabstractキーワードを追加する必要はありません.
    リファレンス
    Kotlin in Action
    間違った部分にコメントを残したら修正します…!!