繁体   English   中英

是否可以覆盖Dart中的顶级功能?

[英]Is it possible to override a top-level function in Dart?

让我们说我有这个顶级功能:

function log(String message) {
    print(message);
}

是否可以在Dart中覆盖此功能?

简单回答:不可以。顶层不能被子类化,因此无法覆盖。

更长的答案:你可以“掩盖”它们,但根据你的用例,这可能不是你想要的。

如果您想要更改由库本身调用的第三方库的顶级方法的行为,这是不可能的(至少,我不知道如何做到这一点)。

如果您只想定义一个具有相同名称的方法以在您自己的库中使用,您可以只定义该方法并使用它。 如果在导入dart文件中需要库和您自己的方法,则可以在库前添加前缀并使用或不使用前缀来区分这些方法:

import "lib1.dart" as mylib;

void main() {
    log(); // log() method defined in this file
    mylib.log(); // log() method defined in lib1.dart
}

我不确定你是否可以覆盖函数,但是你不能把它包装成一个类并使用继承来覆盖一个方法吗?

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);          
   }
}

这似乎是不可能的。

在try.dartlang.org上试试这个:

test() => print('hallo');
test() => print('bye');

main() {
    test();
}

并看到你得到一个编译错误(“重复定义”);

如果我们在谈论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."
}

我相信你现在可以使用分区执行来做到这一点。

这可用于在测试中重新映射打印命令。 必须从runZoned()调用中调用所有应重定向的代码。

请参阅: https//github.com/flutter/flutter/blob/master/packages/flutter/test/foundation/capture_output.dart

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM