Pular para o conteúdo principal

invalid_implementation_override

Detalhes sobre o diagnóstico 'invalid_implementation_override' produzido pelo analisador do Dart.

'{0}.{1}' ('{2}') isn't a valid concrete implementation of '{3}.{1}' ('{4}').

The setter '{0}.{1}' ('{2}') isn't a valid concrete implementation of '{3}.{1}' ('{4}').

Descrição

#

O analisador produz este diagnóstico quando todas as condições a seguir são verdadeiras:

  • Uma classe define um membro abstrato.
  • Há uma implementação concreta desse membro em uma superclasse.
  • A implementação concreta não é uma implementação válida do método abstrato.

A implementação concreta pode ser inválida por incompatibilidades no tipo de retorno, nos tipos dos parâmetros do método ou nos parâmetros de tipo.

Exemplo

#

O código a seguir produz este diagnóstico porque o método A.add tem um parâmetro do tipo int, e o método B.add, que o sobrescreve, tem um parâmetro correspondente do tipo num:

dart
class A {
  int add(int a) => a;
}
​
class B extends A {
  int add(num a);
}

Isso é um problema porque, em uma invocação de B.add como a seguinte:

dart
void f(B b) {
  b.add(3.4);
}

B.add deve aceitar, por exemplo, um double, mas quando o método A.add é executado (porque é a única implementação concreta de add), uma exceção em tempo de execução será lançada, pois um double não pode ser atribuído a um parâmetro do tipo int.

Correções comuns

#

Se o método na subclasse puder se adequar à implementação na superclasse, então altere a declaração na subclasse (ou remova-a, se for igual):

dart
class A {
  int add(int a) => a;
}
​
class B extends A {
  int add(int a);
}

Se o método na superclasse puder ser generalizado para ser uma implementação válida do método na subclasse, então altere o método da superclasse:

dart
class A {
  int add(num a) => a.floor();
}
​
class B extends A {
  int add(num a);
}

Se nem o método da superclasse nem o da subclasse puderem ser alterados, então forneça uma implementação concreta do método na subclasse:

dart
class A {
  int add(int a) => a;
}
​
class B extends A {
  int add(num a) => a.floor();
}

Encontrou essa página sem tradução ou que precisa de correção? Abra uma issue e nos ajude a manter esse site em PT-BR para ajudar pessoas como você.