Callable クラス
CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 84/110。
Dartでは、call()メソッドを実装することで、クラスのインスタンスを関数のように呼び出し可能にできます。これにより、インスタンスに直接かっこを付けた関数呼び出し構文を使って、オブジェクトを利用できます。
class Multiplier {
final int factor;
Multiplier(this.factor);
int call(int value) {
return value * factor;
}
}
void main() {
var double = Multiplier(2);
var triple = Multiplier(3);
print(double(5)); // 10 - オブジェクトを関数のように呼び出している
print(triple(5)); // 15
}double(5)と記述すると、Dartは引数として5を渡してcall()メソッドを自動的に呼び出します。このオブジェクトは状態(factorフィールド)を維持しながら、関数のように振る舞います。
call() method には、multiple parameter、optional parameter、さらには異なる型を返す場合など、どのようなシグネチャでも指定できます。
class Greeter {
final String greeting;
Greeter(this.greeting);
String call(String name, {String punctuation = '!'}) {
return '$greeting, $name$punctuation';
}
}
void main() {
var hello = Greeter('Hello');
print(hello('Alice')); // Hello, Alice!
print(hello('Bob', punctuation: '.')); // Hello, Bob.
}Callable class は、状態や設定と組み合わせた function のような動作が必要な場合に便利です。設定を call の間で保持する必要がある、再利用可能な操作、バリデーター、または変換を作成するためによく使用されます。
チャレンジ
簡単callable クラスを使用してテキスト formatter システムを構築しましょう!さまざまな方法でテキストを変換するために、function のように呼び出せる object を作成します。また、それぞれが独自の設定を保持します。
コードを2つのファイルに整理します。
formatters.dart:テキストを変換する2つの callable クラスを Create します。Wrapperクラスは、prefix と suffix でテキストをラップします。String prefixとString suffixを保存し、String textparameter で呼び出されたとき、prefix と suffix の間にラップされたテキストを return する必要があります。Repeaterクラスは、テキストを指定された回数だけ repeats します。int timesvalue を保存し、String textparameter で呼び出されたとき、各 repetition の between にスペースを入れて、その回数だけ repeated されたテキストを return する必要があります。
main.dart:formatters を import し、callable クラスがどのように機能するかを示します。- prefix
"["と suffix"]"を持つWrapperを Create します - prefix
"***"と suffix"***"を持つ anotherWrapperを Create します - 3回 repeats する
Repeaterを Create します - first の wrapper を
"Hello"で Call し、result を print します - second の wrapper を
"Important"で Call し、result を print します - repeater を
"Go"で Call し、result を print します - 最後に、それらを Combine します:repeater を
"Dart"で calling した result を使って first の wrapper を call し、result を print します
- prefix
各 formatter object が自身の設定を remember し、function のように parentheses を付けて直接 calling できることに注目してください!
Expected output:
[Hello]
***Important***
Go Go Go
[Dart Dart Dart]自分で試してみよう
import 'formatters.dart';
void main() {
// TODO: プレフィックス "[" とサフィックス "]" を持つ Wrapper を作成する
// TODO: プレフィックス "***" とサフィックス "***" を持つ別の Wrapper を作成する
// TODO: 3回繰り返す Repeater を作成する
// TODO: 最初の wrapper を "Hello" で呼び出し、結果を出力する
// TODO: 2つ目の wrapper を "Important" で呼び出し、結果を出力する
// TODO: repeater を "Go" で呼び出し、結果を出力する
// TODO: それらを組み合わせる: 最初の wrapper を、次の結果で呼び出す
// repeater を "Dart" で呼び出した結果で、結果を出力する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ13高度な OOP の概念
コンポジション vs 継承拡張メソッドCallable クラスSealed クラス (Dart 3)レコード (Dart 3)パターンとマッチング (3.0)メソッドを持つ Enum自分で練習してみよう: Dartオンラインコンパイラ