Kotlinのような継承構造

3907 ワード

インタフェースinterfaceキーワードを使用してインタフェースを宣言
interface Clickable{
    fun click()
}

次にこのインタフェースを実現します
class Button : Clickable{
    override fun click() = println("I was clicked")
}

KotlinではJavaのextendsimplementsのキーワードの代わりにコロンを使用します.Javaと同様に、1つのクラスで複数の任意のインタフェースを実装できますが、1つのクラスしか継承できません.
Javaの@Override注記と同様に、override修飾子は、書き換えられた親のインタフェースのメソッドおよびプロパティを表示するために使用されます.
インタフェースにはデフォルトのインプリメンテーションがあり、もちろんサブクラスでshowOff関数のインプリメンテーションを再定義することもできます.
interface Clickable{
    fun click()
    fun showOff() = println("I'm clickable!") //        
}

同じ方法を実装した別のインタフェースを定義します
interface Focusable{
    fun setFocus(b:Boolean) = println("I ${if (b) "got" else "lose"} focus")
    fun showOff() = println("I'm focusable!")
}

次に、デフォルトの実装付きshowOffメソッドを含む2つのインタフェースをサブクラスで同時に実装します.サブクラスでは、Javaでベースクラスの名前をsuperキーワードの前に置くことができます.しかしKotlinではベースクラスの名前をカッコに入れる必要があります
class Button2 : Clickable,Focusable{
override fun showOff() {
    super.showOff()
    super.showOff()
}
override fun click() {}

}
注意:JavaでKotlinを実装するインタフェースは、Javaではインタフェースのデフォルトメソッドをサポートしていません.サブクラスではメソッドボディを実装する必要があります.
Open、final、abstract修飾子:デフォルトはfinalopenopenクラスを宣言
open class RichButton : Clickable{ //    open :        
    override fun click() {}//         open          open 
    fun disable(){} //     final :         
    open fun animate(){}//     open :         
}

注意:ベースクラスまたはインタフェースのメンバーを書き換えた場合、書き換えたメンバーもデフォルトでopenです.クラスのサブクラスがあなたの実装を書き換えるのを阻止したい場合は、書き換えのメンバーをfinalと表示して表示できます.
open class RichButton: Clickable {
    final override fun click(){}
}

抽象クラス
Kotlinでは、Javaと同様に、クラスをabstractと宣言することができます.このクラスはインスタンス化できません.また、その内部の抽象メンバーは常にopenであるため、open修飾子を表示する必要はない.
abstract class Animated{
    abstract fun animate()
    open fun stopAnimating(){}
    fun animateTwice(){}
}

修飾子
  • アクセス修飾子一般クラスのメンバーのデフォルトはfinalです.インタフェース、抽象クラスのメンバーのデフォルトはopenです.子クラス継承の親メソッドがopenである場合、子クラス書き換え後のメソッドもopen
  • である.
    修飾子
    関連メンバー
    コメント
    final
    書き換えられない
    クラス内のメンバーのデフォルトの使用
    open
    書き換えられる
    明確な表明が必要だ
    abstract
    書き直さなければならない
    抽象クラスでのみ使用できます.抽象メンバーは実装できません
    override
    親またはインタフェースのメンバーの書き換え
    finalを使用していない場合、書き換えたメンバーはデフォルトでオープンです.
  • 可視性修飾子(デフォルトはpublic)
  • 修飾子
    クラスメンバー
    最上位宣言
    public(デフォルト)
    すべての場所で表示
    すべての場所で表示
    internal
    モジュールに表示
    モジュールに表示
    protected
    サブクラスで表示
    ------------
    private
    クラスに表示
    ファイルに表示
    内部クラスとネストクラス
    Kotlinに表示されていないネストクラスは、Javaのstaticネストクラスと同様に、内部クラスにして外部クラスの参照を持つにはinnerを使用します.以下はJavaとKotlinのこの動作の違いです.
    クラスAは別のクラスBで宣言される
    Javaで
    Kotlinで
    ネストされたクラス(外部クラスの参照は保存されません)
    static class A
    class A
    内部クラス(外部クラスの参照を格納)
    class A
    inner class A
    密封類:制限された類継承構造を定義するwhen式を使用すると、Kotlinコンパイル期間でデフォルトのオプションが強制的にチェックされます.デフォルトのブランチを追加しなければなりません.Kotlinはこの問題に解決策を提供した:sealed類.親クラスにsealed修飾子を追加し、作成可能な子クラスを厳格に制限し、すべての直接子クラスを親クラスにネストする必要があります.
     sealed class Expr  //         ,sealed       open 
    {
        class Num(val value:Int) : Expr()   //            
        class Sum(val left:Expr,val right:Expr) : Expr()
    }
    
    fun simplifyEval2(e:Expr):Int =
        when(e){// “when”             ,      “else”  
           is Expr.Num ->
                e.value
           is Expr.Sum ->
                simplifyEval2(e.left) + simplifyEval2(e.right)
        }