none
Iniciante - Dúvida sobre utilização de interfaces RRS feed

  • Pergunta

  • Olá,

    Eu estou brincando com um projeto próprio por aqui e me deparei com a seguinte dúvida: imagine que eu tenho duas classes que "compartilham" de uma quantidade vasta de objetos de outras classes. Por exemplo:

    Classe Carro_doméstico -> Classe Material -> Classe Peças -> Classe Pneu --> Classe Normal

    Classe Van -> Classe Material -> Classe Peças -> Classe Pneu --> Classe Especial

    *É apenas um exemplo, por favor, não se atenham a uma relação imaginada em virtude do nome das classes. Eu simplesmente não estou conseguindo pensar em um exemplo melhor.

    Todos os outros objetos dentro de Carro_doméstico, além de Material, são similares tanto para Van e Carro. O mesmo vale para os outros objetos dentro de Peças e etc.

    Imagine que o tipo de automóvel (Van ou Carro_doméstico) só é diferente do outro tipo por causa do tipo de Pneu. Esse tipo só pode ser Normal para um Carro_doméstico ou Especial para uma Van. Talvez valha dizer que todas as propriedades da classe "Normal" são distintas das da classe "Especial". 

    Eu imaginei utilizar herança inicialmente, criando uma classe Base das quais Carro_doméstico e Van seriam derivadas, mas eu precisaria de uma grande quantidade de outras classes pra isso - me corrijam, por favor, se eu estiver errado - pois, precisaria de várias classes para, por exemplo, adicionar a Classe Especial (que tem que ficar "dentro" de Pneu, né). Por isso, risquei essa opção - pelo menos até suas respostas, lol.

    Então decidi fazer isso utilizando-me de composição e interfaces. O problema é que tenho pouquíssima experiência com isso e gostaria de saber se existe algum outro meio ou se vocês acham que essa é uma boa opção. Se sim, qual a melhor forma de implementar a Interface ? Eu realmente não tenho muito conhecimento sobre o assunto e, os exemplos que vejo, pelo menos, não tratam de problemas com "tantas" composições uma dentro das outras - o que me confunde um pouco. Um exemplo que estudei foi esse daqui:

    http://en.wikipedia.org/wiki/Composition_over_inheritance

    O que eu imagino fazer é criar uma porrada de interfaces que contemplem as necessidades mútuas tanto de Van quanto para Carro, sendo que a classe Pneu possa ter classes "Especial" ou "Normal" que se originem de uma mesma interface. É uma boa ideia ? Eu realmente tenho essa dúvida, mas como tenho receio de ter que "reprojetar" muitas vezes o que eu for fazer, venho atrás da opinião dos profissionais.  Agradeço desde já.

    Att,

    Ricardo S.

    segunda-feira, 25 de novembro de 2013 19:25

Respostas

  • Ricardo,

    Tudo vai depender de como você quer separar e organizar seu projeto. no primeiro exemplo vc teria as classes e dentro da classe uma propriedade herando outra classe.

     public class veiculos
        {
            public int ID { set; get; }
            public string nome { set; get; }
            public Classificacao classificacao { get; set; }
            public bool possuiPneu { get; set; }
            public Pneu pneu { get; set; }
            public bool possuiMotor { get; set; }
            public Motor motor { get; set; }
        }

    neste exemplo que só tenho um tipo de pneu. mais eu posso ter uma lista de pneus se necessario.

     public class veiculos
        {
            public int ID { set; get; }
            public string nome { set; get; }
            public Classificacao classificacao { get; set; }
            public bool possuiPneu { get; set; }
            public List<Pneu> pneu { get; set; }
            public bool possuiMotor { get; set; }
            public Motor motor { get; set; }
        }

    eu costumo trabalhar desta forma ao invez de herdar classes.

    • Marcado como Resposta themartians segunda-feira, 2 de dezembro de 2013 01:58
    terça-feira, 26 de novembro de 2013 16:23

Todas as Respostas

  • themartians,

    Carro é um Veiculo certo ??? e uma Van também é um Veiculo certo???????? que tal criar uma Interface chamada Veiculo, pois todos eles tem pneu, motor , volante , acentos e etc......



    Diego Almeida Barreto
    System Analyst / Software Developer

    segunda-feira, 25 de novembro de 2013 22:23
  • Olá,

    Muito obrigado pela resposta. Com certeza, amigo, eu realmente posso iniciar tudo chamando o que eu estou criando de "Veículo" e, na realidade, eu faço isso. Mas existem, por exemplo, algumas considerações sobre objetos que compõe o veículo que eu realmente gostaria de manter. Por exemplo, em Pneu, eu posso colocar preço, tamanho, cor, etc. E eu não gostaria de criar uma interface com esses dados.

    Uma das minhas preocupações é se, posteriormente, eu adicionar - apenas um exemplo - uma classe jet-ski. Um jet-ski não dispõe de rodas (lol, eu sei que você sabe disso). Ou ainda uma classe rolimã - que não dispõe de motor.  O problema é que disponho de certa dificuldade em "encaixar" isso no código. Basicamente, o que vou percebendo é que terei que criar uma interface pra cada classe. Mas ei, eu posso estar falando besteira, eu sou o noob aqui.

    Valeuzão pela resposta Diego.

    Att,

    Ricardo S.

    *Acho que vale lembrar que essa estrutura com classes Veículos é apenas um exemplo relacionado com a questão.

    Edit: Agora me ocorreu o seguinte: Se eu fizer uma interface e apenas uma em Veículos, por exemplo, como eu colocaria as diferentes propriedades dos tipos de Pneu (Especial e Normal) para Van e Carros_Domésticos no programa ? Eu poderia colocar como sendo propriedades a parte, mas essas propriedades não ficariam dentro da classe "Pneu".
    segunda-feira, 25 de novembro de 2013 23:10
  • Não sei se entendi direito, mais segue um exemplo em C#. Veja se é isso

    namespace Veiculos
    {
        public enum TipoVeiculo
        {
            Van,
            Carro,
            Moto,
            Barco
        }
        public class veiculos
        {
            public int ID { set; get; }
            public string nome { set; get; }
            public Classificacao classificacao { get; set; }
            public bool possuiPneu { get; set; }
            public Pneu pneu { get; set; }
            public bool possuiMotor { get; set; }
            public Motor motor { get; set; }
        }
    
        public class Classificacao
        {
            public int ID { get; set; }
            public TipoVeiculo Tipo { get; set; }
        }
    
        public class Pneu
        {
            public int ID { get; set; }
            public string nome { get; set; }
            public double valor { get; set; }
        }
    
        public class Motor
        {
            public int ID { get; set; }
            public int Potencia { get; set; }
        }
    }

    terça-feira, 26 de novembro de 2013 11:44
  • Olá,

    Hmmm... Eu sei que é só um exemplo, mas não entendo porque haveria uma classe motor e uma propriedade possuiMotor coexistindo dentro da classe "veiculos". O que eu acho que talvez tenha que ficar mais claro - não sei se esse é o ponto o qual você não entendeu - é que dentro da minha classe Material existem uns 5 tipos de objetos dentre os quais Peças. Dessas, as outras quatro classes também apresentam composição e os objetos dentro delas também a apresentam e por aí vai.

    O que é diferente entre as classes "Van" e "Carro_Doméstico" seria um dos objetos adicionados na classe Pneu, que poderia ser da classe "Especial" ou "Normal". Parece-me, pelo menos aos meus olhos, que muitíssima coisa pode ser reaproveitada. Por isso, imaginei inicialmente utilizar-me de herança como se houvesse uma classe "baseVeiculos" com todos os atributos presentes na interseção das classes "Van" e "Carro_Doméstico" e que eu imagino que irão persistir se eu adicionar uma outra classe como "Jet-Ski" ou "Rolimã" . Considerando que SEMPRE - é só uma consideração para o exemplo - a interseção da classe "veículos" será igual à interseção das classes de "Carro_Doméstico" e "Van" independente de outras classes que for adicionar surge o seguinte problema: eu devo criar, por exemplo, uma classe "Material_para_Van" e outra "Material_para_Carro", uma classe "Peças_para_Van" e outra "Peças_para_Carro", além das classes referentes aos outros objetos e por aí vai.

    Minha pergunta não é apenas"como que se faz ?", mas sim "dá pra fazer" ? Eu esbarrei em utilização de interfaces com composição, mas não sei exatamente se é a melhor forma.

    Valeu, muito obrigado pelo seu tempo, Rafael.

    *Edit: Como eu disse, esse é apenas um exemplo, o que eu gostaria é de um auxílio na obtenção da resposta para um problema geral e não para o problema específico.
    • Editado themartians terça-feira, 26 de novembro de 2013 12:50 Tinha esquecido de algo.
    terça-feira, 26 de novembro de 2013 12:49
  • Olá Ricardo,

    Se a pergunta é "dá pra fazer?" a resposta é SIM. porem é necessário verificar exatamente como e o que você está tentando fazer. lembre-se que a classe "PAI" deve conter somente o que as Classes "Filhos" tem em comum. porem as classes Filhos tambem podem passar suas heranças para outras classes.

    namespace Veiculo
    {
        public class veiculo
        {
            public int velocidade { get; set; }
            public int tamanho { get; set; }
        }
    
        public class van : veiculo
        {
            public int lugares { get; set; }
            public int rodas { get; set; }
        }
    
        public class vanestendida : van
        {
            public int vagoes { get; set; }
        }
    }

    terça-feira, 26 de novembro de 2013 15:49
  • Olá,

    Isso resultaria em uma grande quantidade de classes. O que me informaram é com composição e interfaces eu conseguiria contornar isso, pois, apesar de ter que gerar várias interfaces e declarar os seus membros nas classes "implementadoras", essas interfaces sempre estariam disponíveis para um caso futuro. Nesse caso aí de cima que você mencionou, por exemplo, eu teria que ter uma classe "vanestendida", "vanestendidamaterial" e "vanestendidapeca", etc e as usaria exclusivamente para a parte de os objetos "van". Ainda teria uma classe "carroestendida"e por aí vai. Não sei se eu interpretei errado o que me informaram. Isso procede ?

    Att,

    Ricardo S.

    terça-feira, 26 de novembro de 2013 16:12
  • Ricardo,

    Tudo vai depender de como você quer separar e organizar seu projeto. no primeiro exemplo vc teria as classes e dentro da classe uma propriedade herando outra classe.

     public class veiculos
        {
            public int ID { set; get; }
            public string nome { set; get; }
            public Classificacao classificacao { get; set; }
            public bool possuiPneu { get; set; }
            public Pneu pneu { get; set; }
            public bool possuiMotor { get; set; }
            public Motor motor { get; set; }
        }

    neste exemplo que só tenho um tipo de pneu. mais eu posso ter uma lista de pneus se necessario.

     public class veiculos
        {
            public int ID { set; get; }
            public string nome { set; get; }
            public Classificacao classificacao { get; set; }
            public bool possuiPneu { get; set; }
            public List<Pneu> pneu { get; set; }
            public bool possuiMotor { get; set; }
            public Motor motor { get; set; }
        }

    eu costumo trabalhar desta forma ao invez de herdar classes.

    • Marcado como Resposta themartians segunda-feira, 2 de dezembro de 2013 01:58
    terça-feira, 26 de novembro de 2013 16:23
  • Não era exatamente o que eu queria, mas deu outra opção.

    Valeu.

    segunda-feira, 2 de dezembro de 2013 01:58