@override アノテーション
CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 39/110。
@override アノテーションは、親クラスのメソッドを意図的に置き換えていることを Dart(および他の開発者)に伝える、ベストプラクティスの目印です。メソッドのオーバーライドはこれがなくても機能しますが、@override を使用すると重要な安全策が加わります。
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
@override
void speak() {
print('$name barks: Woof!');
}
}annotation には2つの重要な利点があります。第一に、意図を明確に文書化できます。コードを読む人は誰でも、この method が parent class に存在することをすぐに理解できます。第二に、parent method が実際には存在しない場合、Dart の analyzer が警告してくれるため、タイプミスやリファクタリングのミスを早期に発見できます。
@overrideなしでメソッド名のスペルを間違えると何が起こるか、考えてみましょう。
class Cat extends Animal {
Cat(String name) : super(name);
void speek() { // Typo!@override がないと警告が出ない
print('$name meows');
}
}annotation がない場合、Dart は新しい method speek() を作成していると見なします。@override を付けると、analyzer はそのような method が parent class に存在しないことを直ちに指摘します。この単純な annotation によって、後から追跡するのが難しい微妙なバグを防げます。
チャレンジ
簡単継承した behavior をカスタマイズする際の @override annotation の重要性を示す media player system を構築しましょう。それぞれ独自の方法でコンテンツを再生する、異なる media type を作成します。
コードを2つのファイルに整理します。
media.dart:ここで media hierarchy を定義します。Mediaclass。String titleproperty、title を受け取る constructor、およびPlaying: [title]を prints するplay()method を持ちます。Mediaを extends し、String artistproperty を追加するSongclass。@overrideannotation を使用し、play()を override してPlaying song: [title] by [artist]を prints します。Mediaを extends し、int durationproperty(秒単位)を追加するVideoclass。@overrideを使用し、play()を override して、まずsuper.play()で parent のバージョンを call し、その後Duration: [duration] secondsを prints します。
main.dart:media file を import し、override された method を実演します。- title
'Generic Content'のMediaobject を Create し、play()を call します。 - empty line を Print します。
- title
'Imagine'、artist'John Lennon'のSongを Create し、その後play()を call します。 - empty line を Print します。
- title
'Dart Tutorial'、duration360のVideoを Create し、その後play()を call します。
- title
@override annotation は意図を document し、errors の検出に役立ちます。誤って play() を plya() と misspell した場合、parent class にそのような method が存在しないことを annotation が alert してくれます。
Expected output:
Playing: Generic Content
Playing song: Imagine by John Lennon
Playing: Dart Tutorial
Duration: 360 seconds自分で試してみよう
import 'media.dart';
void main() {
// TODO: Create a Media object with title 'Generic Content' and call play()
// TODO: 空行を出力する
// TODO: タイトル 'Imagine'、アーティスト 'John Lennon' の Song を作成し、play() を呼び出す
// TODO: 空行を出力する
// TODO: Create a Video with title 'Dart Tutorial' and duration 360, then call play()
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ自分で練習してみよう: Dartオンラインコンパイラ