Pergunta

Vamos dizer que eu tenho esta função de nível superior:

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

É possível substituir essa função no Dart?

Foi útil?

Solução

Resposta simples:Não.O nível superior não pode ser uma subclasse, de modo a substituir não é possível.

Resposta longa:Você pode "ofuscar" a eles, mas dependendo do seu caso de uso, isso pode não ser o que você deseja.

Se você deseja alterar o comportamento de um alto nível de método de um 3rd-party-biblioteca que é chamado pela própria biblioteca, isso não é possível (pelo menos, eu não conheço nenhuma maneira de fazer isso).

Se você apenas quer definir um método com o mesmo nome para usar na sua própria biblioteca, você pode apenas definir o método e usá-lo.Se a biblioteca e o seu próprio método é necessário a importação de dardo arquivo, você pode prefixo a biblioteca e chamá-lo com ou sem o prefixo para distinguir os métodos:

import "lib1.dart" as mylib;

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

Outras dicas

Eu não tenho certeza se você pode substituir funções, mas você não pode encapsular isso em uma classe e usar a herança para substituir um método?

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

Que parece ser impossível.

Tente isso em try.dartlang.org:

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

main() {
    test();
}

e ver que você tem um erro de compilação ("definição duplicado");

Se estamos a falar de http://en.wikipedia.org/wiki/Method_overriding:

Isso é correto?Eu me sinto estranho, respondendo de forma tão simples e, definitivamente, como os que aqui eu respeito, respondeu que não.

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

Eu acredito que agora você pode fazer isso usando o zoneamento de execução.

Isto pode ser usado para remapear o comando de impressão dentro de um teste.Todo o código que deve redirecionar deve ser chamado de dentro de runZoned() chamada.

Veja: https://github.com/flutter/flutter/blob/master/packages/flutter/test/foundation/capture_output.dart

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top