假设我有这个顶级功能:
function log(String message) {
print(message);
}
是否可以在Dart中覆盖此功能?
答案 0 :(得分:6)
简单回答:不可以。顶级不能被子类化,所以无法覆盖。
更长的答案:你可以“掩盖”它们,但根据你的用例,这可能不是你想要的。
如果你想改变由库本身调用的第三方库的顶级方法的行为,这是不可能的(至少,我不知道如何做到这一点) )。
如果您只想定义一个具有相同名称的方法,以便在您自己的库中使用,您只需定义方法并使用它即可。如果导入dart文件中需要库和您自己的方法,则可以在库前添加前缀并使用或不使用前缀来区分这些方法:
import "lib1.dart" as mylib;
void main() {
log(); // log() method defined in this file
mylib.log(); // log() method defined in lib1.dart
}
答案 1 :(得分:1)
我不确定你是否可以覆盖函数,但是你不能把它包装成一个类并使用继承来覆盖一个方法吗?
abstract class Parent{
void log(String message){
print("parent message");
print(message);
}
}
class Child extends Parent{
void log(String message){
print("child message");
print(message);
}
}
答案 2 :(得分:1)
这似乎是不可能的。
在try.dartlang.org上试试这个:
test() => print('hallo');
test() => print('bye');
main() {
test();
}
并看到您收到编译错误(“重复定义”);
答案 3 :(得分:0)
如果我们在谈论http://en.wikipedia.org/wiki/Method_overriding:
这是对的吗?我觉得很奇怪,回答这个问题非常简单明确,因为我尊敬的人已经回答了这个问题。
class Super {
void log(){
print("I am super.");
}
}
class MoreSuper extends Super {
void log() {
print("I am superer.");
}
}
void main() {
var s = new Super();
var ss = new MoreSuper();
s.log(); // "I am super."
ss.log(); // "I am superer."
}
答案 4 :(得分:0)
我相信您现在可以使用分区执行来执行此操作。
这可用于在测试中重新映射打印命令。必须从runZoned()调用中调用所有应重定向的代码。
请参阅:https://github.com/flutter/flutter/blob/master/packages/flutter/test/foundation/capture_output.dart