Menu
Coddy logo textTech

@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 によって、後から追跡するのが難しい微妙なバグを防げます。

challenge icon

チャレンジ

簡単

継承した behavior をカスタマイズする際の @override annotation の重要性を示す media player system を構築しましょう。それぞれ独自の方法でコンテンツを再生する、異なる media type を作成します。

コードを2つのファイルに整理します。

  • media.dart:ここで media hierarchy を定義します。
    • Media class。String title property、title を受け取る constructor、および Playing: [title] を prints する play() method を持ちます。
    • Media を extends し、String artist property を追加する Song class。@override annotation を使用し、play() を override して Playing song: [title] by [artist] を prints します。
    • Media を extends し、int duration property(秒単位)を追加する Video class。@override を使用し、play() を override して、まず super.play() で parent のバージョンを call し、その後 Duration: [duration] seconds を prints します。
  • main.dart:media file を import し、override された method を実演します。
    • title 'Generic Content'Media object を Create し、play() を call します。
    • empty line を Print します。
    • title 'Imagine'、artist 'John Lennon'Song を Create し、その後 play() を call します。
    • empty line を Print します。
    • title 'Dart Tutorial'、duration 360Video を Create し、その後 play() を call します。

@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()
  
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Dartオンラインコンパイラ