Traits e Polimorfismo
Como Rust implementa interfaces e polimorfismo sem Herança de Classes.
Rust não tem class nem herança (extends). Rust tem Traits (Traços/Comportamentos).
É similar às Interfaces do Java/C#, mas mais flexível.
Definindo um Comportamento
trait Falante {
fn falar(&self) -> String;
}
struct Cachorro;
struct Gato;
impl Falante for Cachorro {
fn falar(&self) -> String { "Au Au".to_string() }
}
impl Falante for Gato {
fn falar(&self) -> String { "Miau".to_string() }
}
Static Dispatch (Generics) - Zero Cost
O compilador gera uma versão da função para cada tipo. Performance máxima (igual C++ templates).
// T DEVE implementar Falante
fn fazer_falar<T: Falante>(animal: T) {
println!("{}", animal.falar());
}
// O compilador cria 'fazer_falar_cachorro' e 'fazer_falar_gato' invisivelmente.
Dynamic Dispatch (Trait Objects) - Flexibilidade
Quando você tem uma lista heterogênea (ex: um vetor de animais variados). Usa vtable (igual métodos virtuais C++). Tem um pequeno custo de runtime.
// Vec de ponteiros (Box) para QUALQUER coisa que implemente Falante
let animais: Vec<Box<dyn Falante>> = vec![
Box::new(Cachorro),
Box::new(Gato),
];
for a in animais {
// Chamada dinâmica
println!("{}", a.falar());
}
Isso permite arquiteturas plugáveis extremamente limpas.
Progresso do Tópico