Menu
Coddy logo textTech

Palavra-chave on em Mixins

Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy — lição 53 de 110.

Às vezes, um mixin precisa usar métodos ou propriedades da classe na qual ele é misturado. A palavra-chave on permite restringir um mixin para ser usado apenas com classes que estendem um tipo específico.

class Animal {
  String name;
  Animal(this.name);
  
  void breathe() => print('$name is breathing');
}

mixin Swimming on Animal {
  void swim() {
    print('$name is swimming');  // Pode acessar 'name' de Animal
    breathe();  // Pode chamar os métodos de Animal
  }
}

class Fish extends Animal with Swimming {
  Fish(String name) : super(name);
}

A declaração on Animal significa que este mixin só pode ser aplicado a classes que estendem Animal. Isso garante que o mixin tenha acesso aos membros de Animal. Sem on, o mixin não saberia que name ou breathe() existem.

Se você tentar usar um mixin restrito em uma classe incompatível, o Dart gera um erro de tempo de compilação:

class Robot with Swimming {}  // Erro! Robot não estende Animal

Esta restrição é útil quando a funcionalidade do seu mixin depende de capacidades específicas de uma classe base. Isso cria um contrato mais seguro - o mixin promete certo comportamento, mas apenas quando possui a base necessária para funcionar corretamente.

challenge icon

Desafio

Fácil

Vamos construir um sistema de veículos que demonstra como a palavra-chave on restringe mixins para funcionarem apenas com classes base específicas. Você criará um mixin que adiciona a funcionalidade de turbo boost, mas ele só poderá ser usado por classes que estendem uma classe base Vehicle.

Você organizará seu código em dois arquivos:

  • vehicles.dart: Defina sua classe base, o mixin restrito e os tipos de veículos aqui:
    • Uma classe Vehicle com uma propriedade String model e uma propriedade int speed. Inclua um construtor que receba ambos os valores. Adicione um método accelerate() que imprime [model] accelerating to [speed] km/h
    • Um mixin TurboBoost restrito a Vehicle usando a palavra-chave on. Este mixin deve ter um método activateTurbo() que imprime [model] TURBO ACTIVATED! e então chama accelerate() (ambos acessíveis devido à restrição on Vehicle)
    • Uma classe SportsCar que estende Vehicle e usa o mixin TurboBoost. Adicione uma propriedade String color. O construtor deve receber model, speed e color. Inclua um método showOff() que imprime [color] [model] ready to race!
  • main.dart: Importe seu arquivo de veículos e demonstre como o mixin restrito funciona:
    • Crie um SportsCar com model 'Ferrari', speed 320 e color 'Red'
    • Chame showOff()
    • Chame activateTurbo()

O mixin TurboBoost pode acessar model e chamar accelerate() porque a declaração on Vehicle garante que ele só será misturado em classes que estendem Vehicle. Isso cria um contrato seguro onde o mixin sabe exatamente quais capacidades estão disponíveis.

Saída esperada:

Red Ferrari ready to race!
Ferrari TURBO ACTIVATED!
Ferrari accelerating to 320 km/h

Folha de consulta

A palavra-chave on restringe um mixin para ser usado apenas com classes que estendem um tipo específico. Isso permite que o mixin acesse com segurança métodos e propriedades da classe base.

class Animal {
  String name;
  Animal(this.name);
  
  void breathe() => print('$name is breathing');
}

mixin Swimming on Animal {
  void swim() {
    print('$name is swimming');  // Pode acessar 'name' de Animal
    breathe();  // Pode chamar os métodos de Animal
  }
}

class Fish extends Animal with Swimming {
  Fish(String name) : super(name);
}

A declaração on Animal garante que o mixin tenha acesso aos membros de Animal. Sem ela, o mixin não saberia que name ou breathe() existem.

Tentar usar um mixin restrito em uma classe incompatível resulta em um erro de tempo de compilação:

class Robot with Swimming {}  // Erro! Robot não estende Animal

Essa restrição é útil quando a funcionalidade do seu mixin depende de capacidades específicas de uma classe base, criando um contrato mais seguro entre o mixin e as classes que o utilizam.

Experimente você mesmo

import 'vehicles.dart';

void main() {
  // TODO: Crie um SportsCar com o modelo 'Ferrari', velocidade 320 e cor 'Red'
  
  // TODO: Chame showOff()
  
  // TODO: Chame activateTurbo()
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos