Dart: 拡張メソッドの使い方

Dart: 拡張メソッドの使い方

June 20, 2024

既存のクラスのコードそのものには手を入れる事なくメソッドを追加する方法が提供されています。

使用例 #

calculator.dart

class Calculator {
  int value = 0;

  void add(int a, int b) {
    value = a + b;
  }
}

calculator_extension.dart

import 'calculator.dart';

extension CalculatorExtension on Calculator {
  void printValue() {
    print("Value: $value");
  }
}

このように使います。calculator_extension.dart の import も必要な点には注意しましょう。

main.dart

import 'calculator.dart';
import 'calculator_extension.dart';

void main() {
  final calculator = Calculator();
  calculator.add(2, 3);
  calculator.printValue(); // "Value is 5"
}

同名のメソッドが競合した場合はオリジナルが優先される #

元のクラスですでに定義されている add() メソッドを重複するメソッドが定義されるとどうなるでしょうか。

extension CalculatorExtension on Calculator {
  void printValue() {
    print("Value is $value");
  }

  void add(int a, int b) {
    value = a + b + 100;
  }
}

結果はオリジナルのメソッドが呼び出されます。

void main() {
  final calculator = Calculator();
  calculator.add(2, 3);
  calculator.printValue(); // "Value is 5"
}

そして、もしオリジナルのメソッドが削除された場合は、拡張された方のメソッドが呼び出されます。

void main() {
  final calculator = Calculator();
  calculator.add(2, 3);
  calculator.printValue(); // "Value is 105"
}

String や int の拡張も可能 #

Dart においてすべてはオブジェクトです。そのため String や int も拡張することが可能です。

void main() {
  "Hello".printText(); // Value is Hello

  print(5.triple()); // 15
}

extension on String {
  void printText() {
    print("Value is $this");
  }
}

extension on int {
  int triple() {
    return this * 3;
  }
}