De que se trata o artigo

Veremos neste artigo diferentes alternativas de projeto que enfatizam tanto o uso de herança como de interface, de forma que você possa comparar as duas abordagens.

Em que situação o tema útil

Encontrar semelhanças entre classes faz parte de nossas tarefas ao programar utilizando o paradigma da orientação a objetos. Neste sentido, veremos neste artigo que criar uma hierarquia de classes prematuramente no projeto pode causar esforço extra quando você precisa desfazê-la. Por outro lado, quando você começa com a definição de interfaces e a partir daí descobre uma boa hierarquia de classes, o processo de refatoração do projeto pode ser mais facilmente efetuado.

Resumo DevMan

Normalmente, programadores expressam semelhanças entre classes utilizando o conceito de hierarquia de classes uma vez que este é um dos primeiros conceitos que aprendemos ao estudarmos a orientação a objetos. Neste artigo, iremos aproveitar este conhecimento já bastante difundido sobre o uso de hierarquia de classes e explorar a diferença entre seu uso e o uso de interfaces em projetos de software orientados a objetos.

Este artigo foi baseado no texto “Interface Oriented Design Book Excerpt: Inheritance and Interfaces” de autoria de Ken Pugh.

Encontrar semelhanças entre classes faz parte de nossas tarefas ao programar utilizando o paradigma da orientação a objetos. Normalmente, programadores expressam semelhanças entre classes utilizando o conceito de hierarquia de classes uma vez que este é um dos primeiros conceitos que aprendemos ao estudarmos a orientação a objetos.

Neste artigo, iremos aproveitar este conhecimento já bastante difundido sobre o uso de hierarquia de classes e explorar a diferença entre seu uso e o uso de interfaces em projetos de software orientados a objetos. Ao enfatizar a definição de interfaces, você entenderá mais precisamente a essência de cada classe. Uma vez determinada a essência, será mais prático e fácil perceber as semelhanças existentes entre as classes de seu projeto.

Criar uma hierarquia de classes prematuramente no projeto pode causar esforço extra quando você precisa desfazê-la. Por outro lado, quando você começa com a definição de interfaces e a partir daí descobre uma boa hierarquia de classes, o processo de refatoração do projeto pode ser mais facilmente efetuado. Isto por que refatorar uma interface para uma hierarquia de classes é mais fácil do que o contrário.

Neste contexto, veremos a partir de agora neste artigo diferentes alternativas de projeto que enfatizam tanto o uso de herança como de interface, de forma que você possa comparar as duas abordagens. Em complemento, apresentaremos alguns trechos de código representando as alternativas orientadas a interface de forma que seja fácil de perceber a diferença em relação a abordagem do uso de herança através do código.

Heranças e interfaces

Você provavelmente aprendeu herança como uma das características iniciais da programação orientada a objetos. Com a herança, uma classe recebe os atributos e métodos de uma classe base. O relacionamento entre a classe base e a classe derivada é referenciado como “é-um” ou, mais especificamente, como “é-um-tipo-de”. Por exemplo, um mamífero “é-um-tipo-de” animal. Através da herança criamos hierarquia de classes.

Você pode já ter escutado algo relacionado a herança aplicada a interfaces. Por exemplo, é dito que uma classe PizzaShop que implementa a interface PizzaOrdering herda a interface. Entretanto, é um certo exagero dizer que PizzaShop “é-um-tipo-de” PizzaOrdering. Ao invés disso, o relacionamento mais aplicável neste contexto é dizer que PizzaShop “disponibiliza-uma” interface PizzaOrdering. Muitas vezes, os módulos que implementam uma determinada interface, por exemplo a interface PizzaOrdering, não são nem mesmos orientados a objetos. Assim, neste artigo usaremos o termo herança apenas quando uma classe derivada herda de uma classe base (como ocorre quando utilizamos o extends em Java). Uma classe “implementa” uma interface se ela possui uma implementação de todos os métodos definidos na interface. Para lidar com este conceito, a linguagem Java faz uso da palavra chave implements.

...
Quer ler esse conteúdo completo? Tenha acesso completo