Quando usar mixins e quando usar interfaces no Dart?

Estou muito familiarizado com os conceitos de interfaces e classes abstratas, mas não estou familiarizado com os conceitos demixins.

Agora, no Dart, todas as aulasA define uma interface implícita, que pode ser implementada por outra classeB usando oimplements palavra-chave Não há maneira explícita de declarar interfaces como, por exemplo, em Java, onde uma interface contém apenas métodos não implementados (e eventualmente variáveis estáticas). No Dart, como as interfaces são definidas por classes, os métodos da interfaceA já pode ser implementado, mas a classe que implementaB ainda precisa substituir essas implementações.

Podemos ver essa situação no seguinte trecho de código:

class A {
  void m() {
    print("method m");
  }
}

// LINTER ERROR: Missing concrete implementation of A.m
// Try implementing missing method or make B abstract.
class B implements A {
}

No Dart, um mixin também é definido por meio de declarações de classe comuns ...

... Em princípio, toda classe define um mixin que pode ser extraído dele. No entanto, nesta proposta, um mixin só pode ser extraído de uma classe que não possui construtores declarados. Essa restrição evita complicações que surgem devido à necessidade de passar parâmetros do construtor para a cadeia de herança.

Um mixin é basicamente uma classe que pode definir métodos não implementados ou implementados. É uma maneira de adicionar métodos a outra classe sem precisar usar logicamente a herança. No Dart, um mixin é aplicado a uma superclasse, que é estendida por herança "normal", como no exemplo a seguir:

class A {
  void m() {
    print("method m");
  }
}

class MyMixin {
  void f(){
    print("method f");
  }
}

class B extends A with MyMixin {
}

Nesse caso, devemos observar queB não precisa implementar nenhum método adicional,A eMyMixin.

Há uma clara distinção entreaplicando um mixin para uma classe e herdando de uma classe, pelo menos em um idioma que suporta apenas herança de pai único, pois, nesse caso, poderíamos aplicar muitos mixins a uma classe, mas uma classe poderia apenas herdar de outra classe.

Há também uma distinção clara entre implementar uma interface e herdar de uma classe. A classe que implementa uma interface precisa implementar obrigatoriamente todos os métodos definidos pela interface.

Portanto, em resumo, o conceito de implementar uma interface tem mais a ver com estabelecer um contrato com a classe que implementa a interface, e o conceito de mixins (como o nome sugere) tem mais a ver com a reutilização de código (sem recorrer a uma hierarquia de herança).

Quando usar mixins e quando usar interfaces no Dart? Existem algumas regras práticas para padrões recorrentes pelo menos especiais ao projetar um software em que seria melhor definir um mixin e aplicá-lo a uma superclasse em vez de fazer com que nossa classe implemente uma interface? Eu apreciaria exemplos concretos de decisões de design em um contexto em que interfaces e mixins poderiam ser usados, mas um é usado sobre o outro (por algum motivo).

questionAnswers(2)

yourAnswerToTheQuestion