Kotlinのような継承構造
3907 ワード
インタフェース
次にこのインタフェースを実現します
KotlinではJavaの
Javaの
インタフェースにはデフォルトのインプリメンテーションがあり、もちろんサブクラスで
同じ方法を実装した別のインタフェースを定義します
次に、デフォルトの実装付き
}
注意:JavaでKotlinを実装するインタフェースは、Javaではインタフェースのデフォルトメソッドをサポートしていません.サブクラスではメソッドボディを実装する必要があります.
Open、final、abstract修飾子:デフォルトはfinal
注意:ベースクラスまたはインタフェースのメンバーを書き換えた場合、書き換えたメンバーもデフォルトで
抽象クラス
Kotlinでは、Javaと同様に、クラスを
修飾子アクセス修飾子一般クラスのメンバーのデフォルトは である.
修飾子
関連メンバー
コメント
final
書き換えられない
クラス内のメンバーのデフォルトの使用
open
書き換えられる
明確な表明が必要だ
abstract
書き直さなければならない
抽象クラスでのみ使用できます.抽象メンバーは実装できません
override
親またはインタフェースのメンバーの書き換え
finalを使用していない場合、書き換えたメンバーはデフォルトでオープンです.可視性修飾子(デフォルトは 修飾子
クラスメンバー
最上位宣言
public(デフォルト)
すべての場所で表示
すべての場所で表示
internal
モジュールに表示
モジュールに表示
protected
サブクラスで表示
------------
private
クラスに表示
ファイルに表示
内部クラスとネストクラス
Kotlinに表示されていないネストクラスは、Javaの
クラスAは別のクラスBで宣言される
Javaで
Kotlinで
ネストされたクラス(外部クラスの参照は保存されません)
static class A
class A
内部クラス(外部クラスの参照を格納)
class A
inner class A
密封類:制限された類継承構造を定義する
interface
キーワードを使用してインタフェースを宣言interface Clickable{
fun click()
}
次にこのインタフェースを実現します
class Button : Clickable{
override fun click() = println("I was clicked")
}
KotlinではJavaの
extends
とimplements
のキーワードの代わりにコロンを使用します.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修飾子:デフォルトはfinal
open
のopen
クラスを宣言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)
}