Rust поддерживает полиморфизм с помощью типажей. Типажи позволяют связывать набор методов со структурным типом (struct, enum).
Сначала мы определяем сигнатуры методов типажа в коде как:
trait MyTrait {
    fn foo(&self);
    ...
}
Когда структура реализует типаж, она устанавливает контракт поведения, который позволяет нам косвенно взаимодействовать со структурой через тип данного типажа (например, &dyn MyTrait) без необходимости знать реальный тип.
Методы типажа, реализованные структурой определяются в блоке реализации:
impl MyTrait for MyStruct { 
    fn foo(&self) {
        ...
    }
    ... 
}