Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Fiz esse código com Decorator. Como posso ajustar ?? Ele não mostra as informações do primeiro carro

  public abstract class Carro
    {
        private string nome = string.Empty;
        private double preco = 0;

        public string Nome
        {
            get { return nome; }
            set { nome = value; }
        }


        public double Preco
        {
            get { return preco; }
            set { preco = value; }
        }

    }

 public abstract class CarroDecorator : Carro
    {

        Carro carro;

        public CarroDecorator()
        {
            carro = null;
        }

        public CarroDecorator(Carro outroCarro)
        {
            carro = outroCarro;
        }

        public string GetNome()
        {
            return carro.Nome + " + " + Nome;
        }

        public double GetPreco()
        {
            return carro.Preco + Preco;
        }

    }
   public class FerrariSpider : CarroDecorator
    {
        public FerrariSpider()
        {

        }

        public FerrariSpider(Carro outroCarro) : base(outroCarro)
        {
            Nome = "Ferrari Spider, ";
            Preco = 255000.99;
        }
    }
 public class FerrariStandart : CarroDecorator
    {
        public FerrariStandart()
        {  }

        public FerrariStandart(Carro outroCarro) : base(outroCarro)
        {
            Nome = "Ferrari Standart, ";
            Preco = 4250.25;
        }
    }

  public class FerrarTurbo : CarroDecorator
    {
        public FerrarTurbo()
        { }

        public FerrarTurbo(Carro outroCarro) : base(outroCarro)
        {
            Nome = "Ferrari Turbo, ";
            Preco = 9500.50;
        }

    }

  class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine(" --------------Ferrari Standart-----------------------");
            Carro carro = new FerrariStandart();
            Console.WriteLine("Descricao --> " + carro.Nome.TrimEnd(' ', ','));
            Console.WriteLine("Preco -->" + carro.Preco.ToString());
            Console.ReadLine();

            Console.WriteLine(" --------------Ferrari Turbo-----------------------");
            carro = new FerrarTurbo(carro);
            Console.WriteLine("Descricao --> " + carro.Nome.TrimEnd(' ', ','));
            Console.WriteLine("Preco -->" + carro.Preco.ToString());
            Console.ReadLine();

            Console.WriteLine(" --------------Ferrari Spider-----------------------");
            carro = new FerrariSpider(carro);
            Console.WriteLine("Descricao --> " + carro.Nome.TrimEnd(' ', ','));
            Console.WriteLine("Preco -->" + carro.Preco.ToString());
            Console.ReadLine();

        }
    }
2 respostas

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!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software