Menu
Coddy logo textTech

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 の間で保持する必要がある、再利用可能な操作、バリデーター、または変換を作成するためによく使用されます。

challenge icon

チャレンジ

簡単

callable クラスを使用してテキスト formatter システムを構築しましょう!さまざまな方法でテキストを変換するために、function のように呼び出せる object を作成します。また、それぞれが独自の設定を保持します。

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

  • formatters.dart:テキストを変換する2つの callable クラスを Create します。
    • Wrapper クラスは、prefix と suffix でテキストをラップします。String prefixString suffix を保存し、String text parameter で呼び出されたとき、prefix と suffix の間にラップされたテキストを return する必要があります。
    • Repeater クラスは、テキストを指定された回数だけ repeats します。int times value を保存し、String text parameter で呼び出されたとき、各 repetition の between にスペースを入れて、その回数だけ repeated されたテキストを return する必要があります。
  • main.dart:formatters を import し、callable クラスがどのように機能するかを示します。
    • prefix "[" と suffix "]" を持つ Wrapper を Create します
    • prefix "***" と suffix "***" を持つ another Wrapper を 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 します

各 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" で呼び出した結果で、結果を出力する
  
}
quiz icon腕試し

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

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

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