簡體   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