Oi, Jonas! Parabéns por mais um desafio concluído com sucesso.
Sua implementação do simulador de transporte demonstra um domínio sólido sobre o funcionamento do polimorfismo de subtipos. Ao utilizar o método GetType().Name, você conseguiu criar uma saída dinâmica que identifica automaticamente qual meio de transporte está sendo calculado, o que deixa o código limpo e evita a repetição de strings manuais.
As fórmulas matemáticas foram aplicadas corretamente dentro de cada sobrescrita (override), respeitando as regras específicas de cada modal. Essa abordagem é excelente para sistemas que precisam calcular estimativas diferentes sob uma mesma interface comum.
Para expandir ainda mais sua lógica, vale pesquisar sobre o uso de Interfaces no C#, que é outra maneira de garantir que diferentes classes possuam o mesmo método, mas sem necessariamente compartilhar uma herança de classe base. Você pode encontrar detalhes na documentação sobre Interfaces no C#.
Conseguiu notar como essa estrutura facilita a adição de um novo meio de transporte, como um "Patinete" ou "Carro", sem precisar alterar o laço foreach principal?
Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!