Menu
Coddy logo textTech

暗黙的インターフェース

CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 46/110。

すべてのDartクラスは自動的にインターフェースを定義するため、完全な実装を持つ具象クラスであっても、あらゆるクラスをインターフェースとして使用できます。これを暗黙的インターフェースと呼びます。

プロパティとメソッドを持つクラスを考えてみましょう:

class Logger {
  String prefix = '[LOG]';
  
  void log(String message) {
    print('$prefix $message');
  }
  
  void clear() {
    print('Clearing logs...');
  }
}

別のクラスが Logger を実装する場合、prefix プロパティを含め、すべてに対して独自の実装を提供しなければなりません。

class FileLogger implements Logger {
  @override
  String prefix = '[FILE]';
  
  @override
  void log(String message) {
    print('$prefix Writing to file: $message');
  }
  
  @override
  void clear() {
    print('Deleting log file...');
  }
}

ここが重要なポイントです。implements を使用する場合、「自分のクラスは同じ形状(同じメソッドとプロパティ)を持つ」と宣言していることになります。コード、コンストラクタ、またはデフォルト値は一切継承しません。インターフェースの構造に従うことだけを約束しているのです。

これにより、暗黙的なインターフェースは交換可能なコンポーネントを作成するための強力な手段となります。Loggerを期待するコードは、その実装が内部でどのように機能するかにかかわらず、そのインターフェースを実装する任意のクラスで動作できます。

challenge icon

チャレンジ

簡単

具体的なクラスが暗黙的なインターフェースとしてどのように機能するかを示す通知システムを構築しましょう。ベースとなる通知クラスを作成し、それをまったく異なる方法で実装することで、implements を使用するとすべてのメンバーを自分で提供する必要があることを確認します。

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

  • notification.dart: ここで通知クラスを定義します:
    • Notification クラス:String channel プロパティを 'default' に設定し、[channel]: [message] と出力する send(String message) メソッド、および 'Notification ready' という文字列を返す getStatus() メソッドを持ちます。
    • EmailNotification クラス:Notificationimplements します。implements を使用しているため、独自の channel プロパティ('email' に設定)、Sending email: [message] と出力する独自の send() メソッド、および 'Email service active' を返す独自の getStatus() メソッドを提供する必要があります。
    • PushNotification クラス:Notificationimplements します。channel'push' に設定し、send()Push alert: [message] と出力させ、getStatus()'Push service connected' を返すようにします。
  • main.dart: 通知ファイルをインポートし、異なるクラスが同じ暗黙的インターフェースをまったく異なる動作でどのように実装できるかを示します:
    • EmailNotificationPushNotification のインスタンスを作成します。
    • 各通知について、getStatus() を使用してステータスを出力し、次にメッセージ 'Hello World' を指定して send() を呼び出します。
    • 2つの通知の間に空行を出力します。

注意:implements を使用する場合、Notification からコードを継承することはありません。そのクラスが同じ形状(同じプロパティとメソッド)を持つことを約束するだけです。各実装クラスは、独自の完全な実装を提供します。

期待される出力:

Email service active
Sending email: Hello World

Push service connected
Push alert: Hello World

自分で試してみよう

import 'notification.dart';

void main() {
  // TODO: EmailNotification インスタンスを作成する
  
  // TODO: getStatus() を使用してメール通知のステータスを表示する
  
  // TODO: メール通知を使用してメッセージ 'Hello World' を送信する
  
  // TODO: 空行を表示する
  
  // TODO: PushNotification インスタンスを作成する
  
  // TODO: getStatus() を使用してプッシュ通知のステータスを表示する
  
  // TODO: プッシュ通知を使用してメッセージ 'Hello World' を送信する
  
}
quiz icon腕試し

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

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