Olá, Maurício!
O problema é que você começa instanciando um FerrariStandart
, que é um decorator, porém sem passar um "objeto decorado" no construtor:
Carro carro = new FerrariStandart();
Então esse código vai chamar justamente o construtor sem parâmetros de FerrariStandart
:
public class FerrariStandart : CarroDecorator
{
public FerrariStandart()
{ }
public FerrariStandart(Carro outroCarro) : base(outroCarro)
{
Nome = "Ferrari Standart, ";
Preco = 4250.25;
}
}
O problema é que FerrariStandart
tem 2 construtores, mas só o primeiro é chamado (porque você não passou parâmetro), então essa instância fica sem o nome preenchido.
Então, acredito que você poderia modificar "Ferrari Standart" para não ser mais um Decorator
, e sim uma simples classe Carro
. Em seguida, você poderia modificar os construtores dos outros decorators para concatenarem o nome do carro. O código ficaria assim:
public class FerrariStandart : Carro
{
public FerrariStandart()
{
Nome = "Ferrari";
Preco = 4250.25;
}
}
public class FerrariSpider : CarroDecorator
{
public FerrariSpider(Carro outroCarro) : base(outroCarro)
{
Nome = outroCarro.Nome + " Spider";
Preco = 255000.99;
}
}
public class FerrarTurbo : CarroDecorator
{
public FerrarTurbo(Carro outroCarro) : base(outroCarro)
{
Nome = outroCarro.Nome + " Turbo";
Preco = 9500.50;
}
}
Assim, ao rodarmos o programa, vamos ver que o nome do carro é progressivamente "decorado" pelas diferentes instâncias de classes que implementam CarroDecorator
:
--------------Ferrari Standart-----------------------
Descricao --> Ferrari
Preco -->4250,25
--------------Ferrari Turbo-----------------------
Descricao --> Ferrari Turbo
Preco -->9500,5
--------------Ferrari Spider-----------------------
Descricao --> Ferrari Turbo Spider
Preco -->255000,99
Na verdade, seria até melhor para esse exemplo que o preço também fosse sendo incrementado a cada nova instância, assim como fizemos com o nome do carro. O que acha?
Boa sorte e bons estudos!