Herança vs Containership
Herança e Containership são dois conceitos importantes encontrados em POO (Exemplo de Programação Orientada a Objetos: C++). Em termos simples, Containership e Herança lidam com o fornecimento de propriedades ou comportamentos adicionais para uma classe. Herança é a capacidade de uma classe herdar propriedades e comportamento de uma classe pai, estendendo-a. Por outro lado, Containership é a capacidade de uma classe de conter objetos de diferentes classes como dados de membros.
O que é Herança?
Como mencionado acima, Herança é a capacidade de uma classe herdar propriedades e comportamento de uma classe pai estendendo-a. A herança essencialmente fornece a reutilização de código ao permitir a extensão de propriedades e comportamento de uma classe existente por uma classe recém-definida. Se a classe A estende B, então a classe B é chamada de classe pai (ou superclasse) e a classe A é chamada de classe filha (ou classe derivada/subclasse). Neste cenário de exemplo, a classe A herdará todos os atributos e métodos públicos e protegidos da superclasse (B). A subclasse pode opcionalmente substituir (fornecer funcionalidade nova ou estendida aos métodos) o comportamento herdado da classe pai. A herança representa um relacionamento “é-um” na OOP. Isso significa essencialmente que A também é um B. Em outras palavras, B pode ser a classe com uma descrição geral de uma certa entidade do mundo real, mas A especifica uma certa especialização. Em um problema de programação do mundo real, a classe Person pode ser estendida para criar a classe Employee. Isso se chama especialização. Mas você também pode primeiro criar a classe Employee e depois generalizá-la também para uma classe Person (i.e. generalização). Neste exemplo, o Funcionário terá todas as propriedades e comportamento da Pessoa (ou seja, Funcionário também é uma Pessoa) e pode conter algumas funcionalidades adicionais (portanto, Pessoa não é um Funcionário) também.
O que é Containership?
Containership é a capacidade de uma classe conter objetos de diferentes classes como dados de membros. Por exemplo, a classe A pode conter um objeto da classe B como membro. Aqui, todos os métodos públicos (ou funções) definidos em B podem ser executados dentro da classe A. A classe A se torna o contêiner, enquanto a classe B se torna a classe contida. Containership também é referido como Composição. Neste exemplo, pode-se dizer que a classe A é composta pela classe B. Em OOP, Containership representa um relacionamento “tem-a”. É importante observar que, mesmo que o container tenha acesso para executar todos os métodos públicos da classe contida, ele não pode alterar ou fornecer funcionalidades adicionais. Quando se trata de um problema de programação do mundo real, um objeto da classe TextBox pode estar contido na classe Form, e assim pode-se dizer que um Form contém um TextBox (ou alternativamente, um Form é composto de um TextBox).
Diferença entre Herança e Containership
Embora Herança e Containership sejam dois conceitos OOP, eles são bem diferentes no que permitem ao programador alcançar. Herança é a capacidade de uma classe herdar propriedades e comportamento de uma classe pai estendendo-a, enquanto Containership é a capacidade de uma classe conter objetos de classes diferentes como dados de membro. Se uma classe for estendida, ela herdará todas as propriedades/comportamentos públicos e protegidos e esses comportamentos poderão ser substituídos pela subclasse. Mas se uma classe estiver contida em outra, o contêiner não terá a capacidade de alterar ou adicionar comportamento ao contido. Herança representa um relacionamento “é-um” em OOP, enquanto Containership representa um relacionamento “tem-um”.