Pular para o conteúdo principal

Estender uma classe

Aprenda como criar subclasses a partir de uma superclasse.

Use extends para criar uma subclasse, e super para referenciar a superclasse:

dart
class Television {
  void turnOn() {
    _illuminateDisplay();
    _activateIrSensor();
  }
  // ···
}
​
class SmartTelevision extends Television {
  void turnOn() {
    super.turnOn();
    _bootNetworkInterface();
    _initializeMemory();
    _upgradeApps();
  }
  // ···
}

Para outro uso de extends, veja a discussão sobre tipos parametrizados na página de Generics.

Sobrescrevendo membros

#

Subclasses podem sobrescrever métodos de instância (incluindo operadores), getters e setters. Você pode usar a annotation @override para indicar que você está intencionalmente sobrescrevendo um membro:

dart
class Television {
  // ···
  set contrast(int value) {
    // ···
  }
}
​
class SmartTelevision extends Television {
  @override
  set contrast(num value) {
    // ···
  }
  // ···
}

Uma declaração de método sobrescrito deve corresponder ao método (ou métodos) que ele sobrescreve de várias maneiras:

  • O tipo de retorno deve ser do mesmo tipo (ou um subtipo do) tipo de retorno do método sobrescrito.
  • Os tipos de parâmetro devem ser do mesmo tipo (ou um supertipo dos) tipos de parâmetro do método sobrescrito. No exemplo anterior, o setter contrast de SmartTelevision muda o tipo de parâmetro de int para um supertipo, num.
  • Se o método sobrescrito aceita n parâmetros posicionais, então o método que sobrescreve também deve aceitar n parâmetros posicionais.
  • Um método genérico não pode sobrescrever um não-genérico, e um método não-genérico não pode sobrescrever um genérico.

Às vezes você pode querer restringir o tipo de um parâmetro de método ou uma variável de instância. Isso viola as regras normais, e é similar a um downcast no sentido de que pode causar um erro de tipo em tempo de execução. Ainda assim, restringir o tipo é possível se o código pode garantir que um erro de tipo não ocorrerá. Neste caso, você pode usar a keyword covariant em uma declaração de parâmetro. Para detalhes, veja a especificação da linguagem Dart.

noSuchMethod()

#

Para detectar ou reagir sempre que o código tenta usar um método ou variável de instância inexistente, você pode sobrescrever noSuchMethod():

dart
class A {
  // Unless you override noSuchMethod, using a
  // non-existent member results in a NoSuchMethodError.
  @override
  void noSuchMethod(Invocation invocation) {
    print(
      'You tried to use a non-existent member: '
      '${invocation.memberName}',
    );
  }
}

Você não pode invocar um método não implementado a menos que uma das seguintes condições seja verdadeira:

  • O receptor tem o tipo estático dynamic.

  • O receptor tem um tipo estático que define o método não implementado (abstract é aceitável), e o tipo dinâmico do receptor tem uma implementação de noSuchMethod() que é diferente daquela na classe Object.

Para mais informações, veja a especificação informal de encaminhamento noSuchMethod.

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ê.