Dart: 拡張メソッドの使い方
June 20, 2024
既存のクラスのコードそのものには手を入れる事なくメソッドを追加する方法が提供されています。
- Extension methods | Dart
- https://dart.dev/language/extension-methods
使用例 #
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;
}
}