在Dart中是否可以覆盖顶层函数?

3
假设我有一个顶级函数:
function log(String message) {
    print(message);
}

在Dart中是否可以重写这个函数?

术语“override”没有明确定义。更多解释您想要的内容将使这个问题更好。 - Alan Knight
5个回答

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

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

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

1
那似乎是不可能的。 在try.dartlang.org上尝试一下:
test() => print('hallo');
test() => print('bye');

main() {
    test();
}

并且您会看到编译错误(“重复定义”);


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."
}

1
为了消除你的困惑:你的代码是可以工作的,但那些是类方法。问题要求顶层方法,即在任何类之外的方法,因此有其他答案。希望能帮到你。:-] - MarioP
谢谢您的澄清。我知道我确实漏掉了什么。为了强调问题的重点,我不会删除我的贡献。 - Damon

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接