1
resposta

Fiz essa implementação de carro com acessórios usando o padrão Decorator. Gostaria de saber se está ok. A classe carro seria uma MODEL. Porém para não usar HERANÇA eu fiz ela ABSTRATA.

 public abstract class Carro
    {
        private double preco = -1;
        private string descricao = "Carro Abstrato";

        public virtual double Preco
        {
            get { return preco; }
        }

        public virtual string Descricao
        {
            get { return descricao; }
        }

    }

  public abstract class DecoratorCarro : Carro
    {

        private double preco = -1;
        private string descricao = "Decorador abstrato de Carro";

        public override double Preco
        {
            get
            {
                return preco;
            }
        }

        public override string Descricao
        {
            get
            {
                return descricao;
            }
        }

    }
 public class FerrariSpider : Carro
    {

        private double preco = 255000.99;
        private string descricao = "Ferrari Spider";

        public override double Preco
        {
            get
            {
                return preco;
            }
        }

        public override string Descricao
        {
            get
            {
                return descricao;
            }
        }

    }

  public class FerrariCouro : DecoratorCarro
    {

        private double preco = 4250.25;
        private string descricao = " Bancos de Couro";

        Carro Carro;

        public FerrariCouro(Carro carro)
        {
            this.Carro = carro;
        }

        public override double Preco
        {
            get
            {
                return this.Carro.Preco + this.preco;
            }
        }

        public override string Descricao
        {
            get
            {
                return this.Carro.Descricao + this.descricao;
            }
        }

    }

 public class FerrariTurbo : DecoratorCarro
    {

        private double preco = 9500.50;
        private string descricao = " Motor Turbo";

        Carro Carro;

        public FerrariTurbo(Carro carro)
        {
            this.Carro = carro;
        }

        public override double Preco
        {
            get
            {
                return this.Carro.Preco + this.preco;
            }
        }

        public override string Descricao
        {
            get
            {
                return this.Carro.Descricao + this.descricao;
            }
        }

    }

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

            //criar um carro
            Console.WriteLine(" --------------Ferrari Padrão-----------------------");
            Carro carro = new FerrariSpider();
            Console.WriteLine("Descricao --> " + carro.Descricao.TrimEnd(' ', ','));
            Console.WriteLine("Preco -->" + carro.Preco.ToString());
            Console.ReadLine();
            Console.WriteLine(" --------------Ferrari Decorada---------------------");

            //decora o carro com banco de couro
            carro = new FerrariCouro(carro);
            //decora o carro com motor turbo
            carro = new FerrariTurbo(carro);
            Console.WriteLine("Descricao --> " + carro.Descricao.TrimEnd(' ', ','));
            Console.WriteLine("Preco -->" + carro.Preco.ToString());
            Console.ReadLine();

        }
    }
1 resposta

A ferraricouro e turbo deveriam ser uma classe so.. vc passaria as informacoes no construtor e sobreescreveria o metodo aproveitando o algoritmo da mae.

A outra classe deveria ser so um carro, já que simplesmente usa as caracteristicas de um carro. Acho importante dar uma revisada nos conceitos para nao confundir a ideia de uma classe, que eh uma definicao de um objeto com o objeto em si.