Articles

OOP Concept for Beginners: What is Inheritance?

herança é um dos conceitos centrais das linguagens de programação orientada a objetos (OOP). É um mecanismo onde você pode derivar uma classe de outra classe para uma hierarquia de classes que compartilham um conjunto de atributos e métodos.

Você pode usá-lo para declarar diferentes tipos de exceções, adicionar lógica personalizada aos frameworks existentes, e até mesmo mapear o seu modelo de domínio para um banco de dados.,

Declare uma hierarquia de hereditariedade

em Java, cada classe só pode ser derivada de uma outra classe. Essa classe é chamada de classe superclasse, ou classe pai. A classe derivada é chamada subclasse, ou classe de crianças.

Você usa a palavra-chave se estende para identificar a classe que sua subclasse se estende. Se você não declarar uma superclasse, sua classe implicitamente estende o objeto da classe. Objeto é a raiz de todas as hierarquias de herança; é a única classe em Java que não Estende outra classe.

o seguinte diagrama e excertos de código mostram um exemplo de uma hierarquia de hereditariedade simples.,

A classe BasicCoffeeMachine não declara uma superclasse e implicitamente estende o objeto de classe. Você pode clonar o projeto de exemplo CoffeeMachine no GitHub.

A classe PremiumCoffeeMachine é uma subclasse da classe BasicCoffeeMachine.

modificadores de herança e acesso

modificadores de acesso definem que classes podem aceder a um atributo ou método. Em um dos meus posts anteriores sobre encapsulação, eu mostrei – lhe como você poderia usá-los para implementar um mecanismo de esconder informações. Mas esse não é o único caso em que você precisa estar familiarizado com os diferentes modificadores., Eles também afetam as entidades e atributos que você pode acessar dentro de uma hierarquia de herança.

Aqui está uma visão geral rápida dos diferentes modificadores:

  • atributos privados ou métodos só podem ser acessados dentro da mesma classe.
  • atributos e métodos sem um modificador de acesso podem ser acessados dentro da mesma classe, e por todas as outras classes dentro do mesmo pacote.
  • atributos ou métodos protegidos podem ser acessados dentro da mesma classe, por todas as classes dentro do mesmo pacote, e por todas as subclasses.,
  • atributos e métodos públicos podem ser acessados por todas as classes.

Como pode ver nessa lista, uma subclasse pode aceder a todos os atributos e métodos protegidos e públicos da superclasse. Se a subclasse e a superclasse pertencem ao mesmo pacote, a subclasse também pode acessar todos os atributos privados de pacote e métodos da superclasse.eu faço isso duas vezes no construtor da classe premium coffeemachine.

i primeiro usar a palavra-chave super para chamar o construtor da superclasse. O construtor é público, e a subclasse pode acessá-lo., A palavra-chave super referencia a superclasse. Você pode usá-lo para acessar um atributo, ou para chamar um método da superclasse que é substituída pela subclasse atual. Mas mais sobre isso na seção seguinte.

o configumap de atributos protegidos é definido pela classe BasicCoffeeMachine. Ao estender essa classe, o atributo também se torna parte da classe PremiumCoffeeMachine, e eu posso adicionar a configuração que é necessária para fazer um expresso para o mapa.,

método que sobrepõe

herança não só adiciona todos os métodos públicos e protegidos da superclasse à sua subclasse, como também lhe permite substituir a sua implementação. O método da subclasse então se sobrepõe ao da superclasse. Esse mecanismo é chamado polimorfismo.

I use that in the PremiumCoffeeMachine class to extend the coffee brewing capabilities of the coffee machine. O método brewCoffee do método BasicCoffeeMachine só pode produzir café filtrante.

I override that method in the PremiumCoffeeMachine class to add support for the CoffeeSelection.,CAFE. Como você pode ver no excerto de código, a palavra-chave super é muito útil se você anular um método. O método brewCoffee da BasicCoffeeMachine já lida com a eleição do café.FILTER_ Coffee e lança um CoffeeException para Deselecções de café não suportadas.posso reutilizar isso no meu novo método brewCoffee. Em vez de reimplementar a mesma lógica, eu apenas verificar se a eleição do café é ESPRESSO. Se não for esse o caso, Uso a palavra-chave super para chamar o método brewCoffee da superclasse.,

Evitar que um método seja substituído

Se você deseja certificar-se de que nenhuma subclasse pode alterar a implementação de um método, você pode declará-lo ao final. No exemplo deste post, eu fiz isso para o método addBeans da classe BasicCoffeeMachine.

muitas vezes é uma boa idéia fazer todos os métodos finais que são chamados por um construtor. Impede qualquer subclasse de, muitas vezes involuntariamente, mudar o comportamento do construtor.,

Uma subclasse é também do tipo de sua superclasse

Uma subclasse não só herda os atributos e métodos da superclasse, mas também herda os tipos de superclasse. No exemplo, o BasicCoffeeMachine é do tipo BasicCoffeeMachine e objeto. And a PremiumCoffeeMachine object is of the types PremiumCoffeeMachine, BasicCoffeeMachine, and Object.devido a isto, pode lançar um objecto PremiumCoffeeMachine para digitar BasicCoffeeMachine.

BasicCoffeeMachinee coffeeMachine = (BasicCoffeeMachine) PremiumCoffeeMachine(beans);

que lhe permite escrever código que usa a superclasse e executá-lo com todas as subclasses.,

neste exemplo, o código do método createCoffeeMachine retorna e o método makeCoffee usa a classe BasicCoffeeMachine. Mas o método createCoffeeMachine instancia um novo objeto PremiumCoffeeMachine. Quando ele é devolvido pelo método, o objeto é automaticamente lançado para BasicCoffeeMachine e o código pode chamar todos os métodos públicos da classe BasicCoffeeMachine.o objecto coffeeMachine é lançado para BasicCoffeeMachine, mas ainda é uma Premium coffeemachine., Então, quando o método makeCoffee chama o método brewCoffee, ele chama o método substituído na classe PremiumCoffeeMachine.

definir classes abstratas

classes abstratas são diferentes das outras classes de que falamos. Eles podem ser estendidos, mas não instanciados. Isso os torna ideais para representar generalizações conceituais que não existem em seu domínio específico, mas permitem reutilizar partes de seu código.

Você usa a palavra-chave abstrato para declarar uma classe ou método como abstrato. Uma classe abstrata não precisa conter nenhum método abstrato., Mas um método abstrato precisa ser declarado por uma classe abstrata.

vamos reformular o exemplo da máquina de café e introduzir a classe AbstractCoffeeMachine como a superclasse da classe BasicCoffeeMachine. Declaro que a classe é abstrata e defino o método abstrato de brewCoffee.

public abstract class AbstractCoffeeMachine { protected Map<CoffeeSelection, Configuration> configMap; public AbstractCoffeeMachine() { this.configMap = new HashMap<CoffeeSelection, Configuration>(); } public abstract Coffee brewCoffee(CoffeeSelection selection) throws CoffeeException; }

como pode ver, não forneço o corpo do método abstract brewCoffee. Declaro-o como faria numa interface., Quando extender a classe AbstractCoffeeMachine, terá de definir a subclasse como abstracta, ou sobrepor o método brewCoffee para implementar o corpo do método.

I do some minor changes to the BasicCoffeeMachine class. Ele agora estende a classe AbstractCoffeeMachine, e o já existente método brewCoffee substitui o método abstrato da superclasse.

outra coisa que eu mudei é o construtor da classe BasicCoffeeMachine. Ele agora chama o construtor da superclasse e adiciona um par de valores de chave para o atributo mapap sem instanciar o mapa., É definido e instanciado pela superclasse abstrata e pode ser usado em todas as subclasses.esta é uma das principais diferenças entre uma superclasse abstrata e uma interface. A classe abstrata não só permite que você declare métodos, mas você também pode definir atributos que não são estáticos e finais.

resumo

Como você viu, herança é um conceito poderoso que lhe permite implementar uma subclasse que estende uma superclasse. Ao fazer isso, a subclasse herda todos os atributos e métodos protegidos e públicos, e os tipos da superclasse., Você pode então usar os atributos herdados da superclasse, usar ou anular os métodos herdados, e lançar a subclasse para qualquer tipo de sua superclasse.

Você pode usar uma classe abstrata para definir uma abstração geral que não pode ser instanciada. Dentro dessa classe, você pode declarar métodos abstratos que precisam ser substituídos por subclasses não-abstratos. Isso é frequentemente usado se a implementação desse método é específica para cada subclasse, mas você quer definir uma API geral para todas as classes da hierarquia.