『Kotlinイン・アクション』第4章を読む (その1)
Kotlinイン・アクションの第4章は「クラス、オブジェクト、インターフェイス」です。 それではいつものようにかいつまんで書いていきます。
インターフェイス
- インターフェイスは複数実装可能 (継承は1つだけ)
// インターフェイスの宣言 interface Clickable { fun showOff() = println("I'm clickable!") } // インターフェイスの実装 class Button : Clickable { // override修飾子必須 override fun showOff() = println("I'm clickable button!") }
アクセス修飾子
クラスの種類 | オーバーライド | インスタンス化 |
---|---|---|
class (default) | 不可 | 可 |
open class | 可 | 可 |
abstract class | 可 | 不可 |
メソッドの種類 | オーバーライド | 実装の有無 |
---|---|---|
fun (default) | 不可 | 有 |
open fun | 可 | 有 |
abstract fun | 可 | 無 |
可視性修飾子
- パッケージプライベートが廃止され、internal追加
- internalはモジュール内で参照可能
- モジュールは一度にコンパイルされるファイルのまとまり
修飾子 | クラスメンバの参照範囲 | トップレベル宣言時の参照範囲 |
---|---|---|
public (default) | どこからでも | どこからでも |
internal | モジュール内 | モジュール内 |
protected | サブクラス内 | - |
private | クラス内 | ファイル内 |
ネストされたクラスと内部クラス
クラスの種類 | 外部クラスへの参照 | Javaでの宣言 | Kotlinでの宣言 |
---|---|---|---|
ネストされたクラス | 保持しない | static class A | class A |
内部クラス | 保持する | class A | inner class A |
// Kotlinの内部クラスから外部クラスへのアクセス class Outer { inner class Inner { fun getOuterReference(): Outer = this@Outer } }
シールドクラス
- 型チェックは シールドクラス内に取りうるサブクラスをすべてネストして列挙する
sealed class Expr { class Num(val value: Int) : Expr() class Sum(val left: Expr, val right: Expr) : Expr() }
// 型チェック時に全てのケースをカバーできるのでelse分岐を取り除ける when (e) { is Expr.Num -> ... is Expr.Sum -> ... }
今回の内容はクラスの宣言方法、修飾子が中心でした。
修飾子についてはデフォルトで好ましい書き方となるようによく配慮されているように感じました。
次回はコンストラクタから見ていきます。