SóProvas


ID
613156
Banca
CESPE / CEBRASPE
Órgão
BRB
Ano
2011
Provas
Disciplina
Engenharia de Software
Assuntos

A respeito de programação orientada a objetos, julgue os itens de
86 a 88.

Na implementação de objetos, a composição de objetos substitui a herança de classe. A herança de classe é definida estaticamente em tempo de compilação, enquanto a composição de objetos é definida dinamicamente em tempo de execução pela obtenção de referências a outros objetos por meio de determinado objeto. O uso da composição não viola o encapsulamento.

Alternativas
Comentários
  • "a composição de objetos substitui a herança de classe"???
    A composição não substitui a herança. São mecanismos distintos.
     - A herança é um mecanismo de especialização das classes
     - Composição, junto com agregação e associação são formas de relacionamentos entre objetos

    Alguem sabe se existe recurso contra esta questão?
  • Vc pode 'simular' a herança através da composição, ao invés de usar o 'extends' (Java) por exemplo.
  • Para mim, esta questão cabe recurso, houve uma afirmação, se o contexto fosse assim ... "a composição de objetos pode  substitui(r) a herança de classe.", daí, consideraríamos correta, infere-se no enunciado que a composição substitui a herança no sentido de reutilização da funcionalidade, veja abaixo:

    Composição e Herança

    • Composição e herança são dois mecanismos para reutilizar funcionalidade
    • Alguns anos atrás (e na cabeça de alguns programadores ainda!), a herança era considerada a ferramenta básica de extensão e reuso de funcionalidade
    • A composição estende uma classe pela delegação de trabalho para outro objeto
      a herança estende atributos e métodos de uma classe
    • Hoje, considera-se que a composição é muito superior à herança na maioria dos casos
      • A herança deve ser utilizada em alguns (relativamente poucos) contextos
    • Vamos portanto desinflar um pouco a bola da herança 

    "http://jacques.dsc.ufcg.edu.br/cursos/map/html/pat/herancavscomposicao.htm"
  • Pra mim a questão já começa errada, quando diz: "Na implementação de objetos..." - Não existe implementação de objetos e sim de classes. O resto da questão eu até concordo, pois realmente, por delegação você pode substituir heranças que, em alguns casos, vão até "engessar" teu sistema.

    Eu já tive que usar composição ao invés de herança.

    Agora, dizer que há implementação de objetos foi demais. Marquei errado por causa desse inicio. Mas acho que às vezes, é preciso abstrair e não levar tudo na ponta da faca...

    Enfim, concurseiro sofre mesmo. Até quando estamos certos, estamos errados!

  • Fiz um recurso pra essa questão alegando que não foi dado nenhuma situação que me possibilitasse dizer que a composição substitui a herançA. Sabemos que ela PODE substiuir a herança em alguns casos.
    O cespe CAGOU e ANDOU pro recurso como quase sempre faz. O gabarito final foi esse mesmo.
    Lamentavel.
  • eu não lembro em que livro eu li, mas um dos princípios que norteam os padrões de projeto é "preferir composição do que herança". se não me engano foi no livro da Kathy Sierra.
  • Sim, devemos preferir a composição a herança.
    Mas só podemos dizer que um substitui o outro se uma situação específica for dada. A substituição pode acontecer ou não.
    Por exemplo: a classe Fruta tem como sub classes Acida e SemiAcida. Como fazer uma composição para representar essa situação?
    Mas pelo visto o cespe entende que a a composição de objetos substitui a herança de classe independente do contexto.
  • Primeira parte: "Na implementação de objetos": na criação dos objetos.
    Segunda parte: "composição de objetos substitui a herança de classe". Substitui? Mas o que isto significa? Sempre?? Acredito que pode sim.
    Não conheço linguagens que não sejam ORIENTADAS A OBJETO.  Pelo que sei OO seria apenas simples estruturas de dados de liguangens estruturadas. Se isto for verdade, toda a OO é apenas uma forma mais fácil na hora de criar estrutras e a OO seria apena um asimples composição.


    Ex de estrutura:
    Em 'C', repare o :
    struct exemplo {    int a;    float b;    char c;  };  struct exemplo ex1, ex2;    ex1.a=2;  ex1.b=1.0/2.0;  ex1.c='g';
    Como se faz uma composição usando esta estrutura?? Não sei....


    Agora em alguns casos pode substituir:
    Se entedi ficaria assim em Java

    // Herança
    class Fruta{
        boolean madura;
    }
    class FrutaAcida extends Fruta{
        float pH = 1;
        // me´todo que define se é acida ou não.
    }
    /////////////////////////////////////////////////////////////////

    // Composição
    class Fruta {
        boolean madura;
    }

    // Acidez pertencendo a outra hieraquia, outro pacote, sei lá
    class Acidez{
        float s = 1.0f;
    }

    // e aqui a composição
    class FrutaAcida{
        Fruta maca;  // maçã
        Acidez acidez;
    }
  • Os princípios de herança e composição são diferentes, entretanto quando se usa o mecanismo de herança fora do seu conceito correto, ele pode ser substituído por composição sim. A minha dúvida é sobre a composição ser definida em tempo de execução.

    Vale lembrar que herança associa uma classe a outra mais genérica. Neste caso, a classe filha tem a relação "é um" com a classe mãe, ou seja, tudo o que a classe mãe faz a classe filha também faz, além disso a classe filha possui elementos específicos e próprios. Por outro lado, quando se usa herança somente para aproveitar os métodos de uma classe, sem a relação "é um", a substituição dos conceitos pode ser feita (herança por composição). Esta questão da CESGRANRIO  (Q258844) também considera esta troca.

    Não há duvidas sobre a herança ser definida em tempo de compilação, mas tenho dúvida sobre a composição ser em tempo de execução. Quando eu defino que uma classe Cliente é associada a uma classe Venda por meio de composição, isso não seria em tempo de compilação também?

    Ex: class Venda{

                Cliente cliente;

                ...

          }

  • Prezados,

    Essa questão é um pouco controversa. Porém tem toda uma explanação no capítulo 1 do livro de Padrões de projeto do GoF que suporta as afirmações :

    "A composição de objetos é uma alternativa à herança de classe. Aqui a nova funcionalidade é obtida pela montagem e/ou composição de objetos, para obter funcionalidades mais complexas. [...] .
    A herança e a composição têm , cada uma, vantagens e desvantagens. A herança de classes é definida estatisticamente em tempo de compilação e é simples de usar, uma vez que é suportada diretamente pela linguagem de programação. [...]
    A composição de objetos é definida dinamicamente em tempo de execução pela obtenção de referências a outros objetos através de um determinado objeto.[...] Como os objetos são acessados exclusivamente através de suas interfaces, nós não violamos o encapsulamento.
    Isso nos conduz ao nosso segundo princípio de projeto orientado a objetos:
    Prefira a composição de objeto à herança de classe. "

    Portanto a questão está correta.