問題の歴史:
KotlinはJavaとJVMの機能的な遺産の最良の側面を組み合わせました。通常のクラスは標準的な構造として宣言され、抽象クラスはデフォルト実装を持つ未定義のテンプレートを作成することを可能にし、インターフェースは状態を持たない振る舞いの多重継承をサポートします。
問題点:
クラス、抽象クラス、インターフェースの間での正しい選択は、アプリケーションのアーキテクチャ、コードの細分化、および拡張性を決定します。不適切な継承は、テストの難しさや将来の変更を引き起こす可能性があります。
解決策:
Kotlinでは、
コードの例:
interface Drawable { fun draw() } abstract class Shape(var color: String) : Drawable { abstract fun calcArea(): Double override fun draw() = println("Shape drawn") } class Circle(color: String, val radius: Double) : Shape(color) { override fun calcArea() = Math.PI * radius * radius }
重要な特徴:
インターフェースはバックフィールドを持つプロパティを含むことができますか?
いいえ、プロパティのシグネチャを定義することはできますが、データを保持することはできません。このため、バックフィールドのないプロパティのみです。
複数のクラスから継承することはできますか?
いいえ、Kotlinはクラスの単一継承のみをサポートしますが、インターフェースの多重実装をサポートします。
インターフェースにコンストラクタを宣言できますか?
いいえ、インターフェースはコンストラクタをサポートしません。なぜなら、状態を保持しないからです—単なる振る舞いの契約なのです。
アプリケーションの全ての共通機能を抽象クラスに移し、内部ロジックや状態がない場合でも、単なる共通の契約が必要な場合です。
長所:
短所:
必要な契約のみをインターフェースに移し、抽象クラスは実装が必要な共通のプロパティとメソッドに制限しました。
長所:
短所: