Kotlinにおけるoverrideキーワードは、スーパークラスまたはインターフェースのメソッドやプロパティを明示的にオーバーライドするために必要です。
Javaでは、スーパークラスのメソッドはキーワードなしでオーバーライドできますが、そのためにエラーやタイポが発生することがあります。Kotlinでは安全性の原則に従って、すべてのオーバーライドには必ずoverrideを指定し、スーパークラスのメンバー自体にはopenを指定する必要があります。
基底クラスのメソッドの偶発的な隠蔽(accidental overriding)や、継承されたメンバーを明示的に管理する必要性があります。また、オーバーライドされるメソッドはopenとしてマークされている必要があり、そうでない場合、コンパイルエラーなしでオーバーライドすることはできません。
スーパークラスまたはインターフェースのメソッドやプロパティにoverrideキーワードを使用し、事前にopen、abstractまたはすでにoverrideとしてマークされたものを指定します。
コードの例:
open class Animal { open fun sound() = "???" } class Dog : Animal() { override fun sound() = "Woof!" }
主な特徴:
overrideキーワードなしでメソッドをオーバーライドすることはできず、コンパイルエラーになります;finalがメソッドに適用されており、明示的にopenとしてマークされたものだけがオーバーライドできます;overrideキーワードはインターフェースやクラスによる多重継承をサポートします。プロパティやメソッドがopen/abstract/overrideとしてマークされていない場合、それをオーバーライドできますか?
いいえ、open/abstract/overrideとして明示的にマークされたメンバーのみがサブクラスでオーバーライド可能です。
インターフェースのメソッドを実装する際にoverrideは必須ですか?
はい、常に必須です。たとえそれが最初のレベルの実装であっても、Kotlinの構文では一貫性のためにoverrideが必要です。
overrideとしてマークされたメソッドはさらにオーバーライドできますか?
はい、メソッドがまだfinalとしてマークされていない場合(デフォルトでoverrideはopenを継承します)、それはさらに階層でオーバーライド可能です。
開発者が基底クラスにopenを付け忘れました:
class Cat { fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" // コンパイルエラー }
利点:
欠点:
クラスの正しい定義と継承の意図:
open class Cat { open fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" }
利点:
欠点: