A única coisa que fiz diferente do enunciado foi usar abstract ao invés de virtual.
Transporte.cs
internal abstract class Transporte
{
internal abstract int CalcularTempo(int distanciaKm);
}
Onibus.cs
internal class Onibus : Transporte
{
internal override int CalcularTempo(int distanciaKm)
=> distanciaKm * 2 + 5;
}
Bicicleta.cs
internal class Bicicleta: Transporte
{
internal override int CalcularTempo(int distanciaKm)
=> distanciaKm * 4;
}
Metro.cs
internal class Metro : Transporte
{
internal override int CalcularTempo(int distanciaKm)
=> distanciaKm + 5;
}
Program.cs
List<Transporte> opcoes =
[
new Onibus(),
new Metro(),
new Bicicleta()
];
int distancia = 10;
foreach (var transporte in opcoes)
Console.WriteLine($"{transporte.GetType().Name}: {transporte.CalcularTempo(distancia)} min");