可调用对象(Callable objects)
在 Dart 中,如果你希望某个类的实例能够像函数一样被调用,可以通过实现 call() 方法来实现。
call() 方法允许定义了该方法的任何类的实例模拟函数的行为。该方法支持与普通函数相同的功能,例如参数和返回类型。
示例:实现 call() 方法
在以下示例中,WannabeFunction 类定义了一个 call() 方法,该方法接收三个字符串参数,将它们拼接在一起,每个字符串之间用空格分隔,并在末尾添加一个感叹号。点击“运行”按钮可以执行代码。
dart
class WannabeFunction {
// 定义 call() 方法,接收三个字符串参数
String call(String a, String b, String c) {
return '$a $b $c!';
}
}
void main() {
// 创建 WannabeFunction 的实例
var wf = WannabeFunction();
// 像调用函数一样调用实例
print(wf('Hello', 'Dart', 'World')); // 输出:Hello Dart World!
}content_copy
说明
在这个例子中,wf是WannabeFunction类的一个实例。由于WannabeFunction实现了call()方法,因此可以直接像调用函数一样调用wf,传递参数并获取返回值。
call() 方法的特点
- 灵活性:
call()方法可以定义任意数量和类型的参数,并返回任意类型的值,与普通函数完全一致。 - 模拟函数行为:通过实现
call()方法,类的实例可以像函数一样被调用,从而提供更灵活的编程方式。 - 适用场景:当你希望某个对象既能保存状态(作为类的实例),又能像函数一样被调用时,
call()方法非常有用。
更多示例
以下是一个更复杂的示例,展示如何通过 call() 方法实现一个带有状态的“函数”:
dart
class Counter {
int count = 0;
// 定义 call() 方法,每次调用时增加计数并返回当前值
int call() {
count++;
return count;
}
}
void main() {
var counter = Counter();
print(counter()); // 输出:1
print(counter()); // 输出:2
print(counter()); // 输出:3
}content_copy
说明
在这个例子中,Counter类的实例counter不仅保存了一个状态(count变量),还可以像函数一样被调用。每次调用counter()时,计数器会增加并返回当前值。
总结
call()方法的作用:允许类的实例像函数一样被调用。- 实现方式:在类中定义一个名为
call()的方法,支持参数和返回值。 - 优势:结合了对象的状态管理和函数的行为,提供了更灵活的编程模型。
- 适用场景:需要对象既能保存状态又能像函数一样被调用的场景,例如计数器、闭包模拟、函数工厂等。