はじめに

私の中でKotlinのイメージは、「Javaよりも現代的で簡潔に書ける言語」という漠然としたものだった。「Kotlinって何が良いの?」と聞かれても、どこがどう現代的で簡潔なのかを自信を持って答えることが出来なかった。

そんな引け目を感じてKotlinのドキュメント(Kotlin Language Documentation)を通読し始めた。現在は「Open and special classes」まで読み進めている。

今回は、その中でも印象に残った「継承」についての話を書いていきたい。

クラスの継承

オブジェクト指向言語の3大機能として継承多態性カプセル化とされるほど、継承はオブジェクト指向にとって大切な要素である。もちろんオブジェクト指向言語の代表格であるJavaではクラスの継承が可能だ。

しかし、Javaの後発として開発されたKotlinでは、クラスの継承はデフォルトでは不可能になっている。もしクラスを継承させたいのであれば、open classと宣言しなければならない。

open class Car()

Kotlinのドキュメント、クラス継承についての章では、このようなことが書かれている。

By default, classes in Kotlin can’t be inherited. Kotlin is designed this way to prevent unintended inheritance and make your classes easier to maintain.

(Kotlin Language Documentation 2.3.20, 130ページ)

意図しないクラスの継承を防ぐことで、保守性を高めることができるらしい。

確かに、Googleで「継承 アンチパターン」で検索すると記事がいくつも出てくる。Google Search

実装するプログラマーによってアンチパターンを引き起こしてしまいそうな機能があるなら、デフォルトでできないようにすればいいじゃないという哲学を感じる。

抽象クラスとインタフェース

クラスの継承ができない代わりに、抽象クラスabstract classインタフェースinterfaceを使った継承は行うことができる。インタフェースは多重継承も可能である。

まとめ

意図しないクラスの継承を言語レベルでできなくすることによって、コードを書いている段階からバグが起こりにくいプログラムが書ける。Kotlinはそんな思想をもとに設計されたのかなぁと夜な夜な考えている。

参考サイト

https://kotlinlang.org/docs/kotlin-pdf.html

(Web版とPDF版で内容が違うっぽい?)