Você está na página 1de 29

Universidade Estadual de Santa Cruz

Bacharelado em Ciência da Computação

CET078 - Linguagem de Programação III

Classes Abstratas. Interfaces e Herança Múltipla.

Prof. Dany S. Dominguez


Objetivos
o Sistematizar os conceitos de classes abstratas e interfaces em POO
o Estabelecer recomendações para uso de classes abstratas e ou interfaces em
diferentes contextos
o Conhecer os problemas associados a herança múltipla, e como são resolvidos
nas diversas linguagens de POO
Roteiro
o Classes abstratas
o Implementação de classes abstratas em Java
o Implementação de classes abstratas em Python
o Interfaces
o Implementação de interfaces em Java
o Implementação de interfaces em Python
o Herança múltipla
o Problemas em herança múltipla
POLIMORFISMO
Polimorfismo - Resumo
Se clasifica em

Parâmetrico De classe De Subclasse

Uma mesma classe Temos uma hierarquia


Diferentes classes tem
tem vários métodos de classes onde
métodos com o
com o mesmo nome e métodos são herdados
mesmo nome
assinaturas diferentes

O compilador ou O compilador ou Em tempo de execução, o


interpretador seleciona interpretador seleciona método na memória do
automaticamente automaticamente objeto instanciado é
dependendo do assinatura dependendo do objeto executado

Herança
Sobrecarga de métodos Sobrescrita de métodos
Polimorfismo - Resumo
o Polimorfismo é a habilidade que possuem os objetos para reagir de modo diferente
recebendo os mesmos mensagens
o Polimorfismo refere-se a possibilidade de definir múltiplas classes com
funcionalidade diferente pero com métodos e propriedades denominados de forma
idêntica
o O polimorfismo de subclasse permite a manipulação de instâncias de classes que
herdam da mesma classe ancestral de forma unificada (upcasting)
Animal
- nome: String
+ Animal()
+ animalSound()

Dog Cat Pig

+ Dog() + Cat() + Pig()


+ animalSound() + animalSound() + animalSound()
Classes abstratas
o Ao criarmos uma hierarquia de classes frequentemente desejamos que as
classes do topo contenham apenas descrições de métodos que devem ser
implementados (métodos sem implementação)
o Normalmente estas classes não podem ser utilizadas para instanciar
objetos
o Entretanto exigem que as classes descendentes implementem os métodos
declarados nelas
o Exemplo peças do jogo de xadrez (mover)
o A maioria das linguagens baseadas em PPO incluem mecanismos para criar
classes abstratas e interfaces, para serem utilizadas nestes casos
Classes abstratas
o Métodos abstratos são declarados somente com seu nome, modificadores,
tipo de retorno e lista de argumentos
o Métodos abstratos são declarados sem corpo
o Métodos abstratos são declarados em Java usando o modificador abstract
o Se uma classe tiver um método abstrato as classes descendentes (que
herdam) devem obrigatoriamente implementar este método mantendo a
assinatura
o Se uma classe incluir algum método abstrato ela deve ser declarada com o
modificador abstract
o Podemos declarar uma classe como abstrata mesmo que não existam
métodos abstratos
o Classes abstratas não podem ser instanciadas
Classes abstratas
o Atributos não podem ser declarados como abstratos
o Atributos de uma classe abstrata são herdados e seguem as mesmas regras
discutidas anteriormente
o Métodos não-abstratos (concretos) de uma classe são herdados e seguem
as mesmas regras discutidas anteriormente
o Construtores de classes abstratas não podem ser abstratos
o Os construtores de uma classe abstrata podem inicializar os atributos da
classe que serão usados nas subclasses, sendo necessários na maioria dos
casos
o Classes abstratas podem ter métodos estáticos, eles não podem ser
abstratos, seu uso segue as regras discutidas anteriormente
o Métodos podem retornar “instancias” de classes abstratas, contanto que
retornem classes não abstratas que herdam da classe abstrata
Classes abstratas
o Exemplo: RoboAbstrato, RoboSimples, RoboComBateria, RoboComplexo

Posição em graus de 0 a 360. Se movimenta N, S, E, O


RoboAbstrato
RoboSimples RoboComplexo
- nomeDoRobo: String
- posXAtual: int
- posYAtual: int + RoboSimples() + RoboComplexo()
- dirAtual: int + move(int) + move(int)
+ RoboAbstrato()
+ move()
+ move(int) RoboComBateria Se movimenta na diagonal
+ moveX(int) NE, NO, SE, SO
+ moveY(int) - energia: int
+ mudaDirecao(int) + RoboComBateria()
+ getDirAtual() + move(int)
+ toString() + toString()

Precisa de bateria para se


movimentar
Classes abstratas
o Detalhes da implementação
o RoboAsbtrato
o Classe abstrata
o Atributos private e protected
o Métodos private e protected
o Métodos abstratos
o RoboSimples
o Implementação de método abstrato
o Uso de métodos protected
o RoboComplexo
o Herança de dois níveis
o Sobrescrita de método abstrato
o Uso de métodos protected
o RoboCombateria
o Atributo estático
o Implementação de método abstrato
o Sobrescrita do método de impressão
o Uso de métodos protected
Classes abstratas
o Operador instanceof
o Permite verificar se um objeto é instancia de uma classe específica
o Sintaxe objectName instanceof className
o Retorna verdadeiro (true) ou falso (false)
Classes abstratas em Python
o Uma classe abstrata pode ser considerada como um modelo para a criação
de outras classes
o Usamos uma classe abstrata quando:
o Desejamos fornecer uma interface comum para diferentes implementações de
um componente
o Projetamos grandes unidades funcionais ou bibliotecas
o Definimos uma API comum para um grupo de subclasses
o Por padrão o Python não fornece classes abstratas, entretanto fornece
alguns mecanismos que nos permitem cria-las
o O método mais comum para criar classes abstratas em Python é usando o
modulo ABC (Abstract Basic Classes)
o O modulo ABC funciona decorando métodos da classe base como abstratos
e, em seguida, registrando classes concretas como implementações da
base abstrata
Classes abstratas em Python
o Para criarmos uma classe abstrata
o Importamos o modulo ABC
from abc import ABC, abstractmethod
o Declaramos uma classe abstrata como
class NomeClasseAbstrata(ABC)
o Definimos um método abstrato
@abstractmethod
def nomeMetodoAbstrato(:)
pass
o Exemplo: Implementação de Robos
o Invocamos métodos concretos da classe abstrata via super()
Classes abstratas
o O que é uma classe abstrata?
o Quais tipos de métodos podemos ter em uma classe abstrata?
o O que é um método abstrato?
o O que é uma classe concreta?
o Quais tipos de métodos podemos ter em uma classe concreta?
o O que é um método concreto?
Interfaces
o Oferecem uma alternativa para criar e usar classes que compartilham tipos
semelhantes de comportamentos, mas não necessariamente têm
relacionamentos de herança significativos
o Por exemplo o comportamento Lavar, ele pode ser compartilhado por um
cachorro, e um carro
o Não teria sentido termos uma hierarquia de herança que contenha
Cachorros e Carros, são objetos de naturezas diferentes.
o O mecanismo de interface pode ser usado para abstrair o comportamento,
de objetos que executam a ação Lavar
o Interface = um conjunto de métodos abstratos que esperamos um grupo de
classes defina segundo seu contexto específico
o Uma interface representa um novo tipo de objeto (um objeto que
implementa a interface é também do tipo da interface)
Interfaces
o Interfaces nos permitem uma maior flexibilidade para criarmos objetos
o As interfaces proporcionam um mecanismo que obriga as classes que as
implementam a definir um conjunto de métodos
o Podemos assumir as interfaces como contratos
o Se uma classe implementa uma interface, ela está vinculada a um contrato,
representando por um conjunto de métodos abstratos, as “condições” do
contrato devem ser atendidas
o Nas primeiras versões de Java, interfaces foram classes abstratas que
incluíam apenas métodos abstratos (comportamentos not fully defined)
o Antes da versão 8 do Java, as interfaces não podiam incluir métodos
concretos
o Nas versões mais recentes uma interface pode incluir métodos abstratos e
concretos, o que oferece uma maior flexibilidade
Interfaces
o Sintaxe: public interfaces nameInterface{ ... }
o Em uma interface todos os métodos são implicitamente abstract e public
(não é necessário incluir explicitamente estes modificadores)
o Em uma interface os métodos abstratos devem ser declarados sem corpo
o Se uma interface tiver atributos, implicitamente são considerados como
static e final, e devem ser inicializados na declaração
o Uma interface não pode ser instanciada
o Uma classe herdeira somente pode herdar de uma única classe (abstrata ou
não-abstrata)
o Uma classe pode implementar (herdar) múltiplas interfaces
simultaneamente
Interfaces
o Interfaces são declaradas com a palavra reservada interface no lugar da
palavra reservada class
o Métodos em interfaces não podem ter modificadores (implicitamente são
public e abstract)
o Interfaces não podem ter construtores
o Interfaces podem utilizar outras classes como argumentos ou tipos de
retorno para seus métodos
o A relação de herança entre um interfaces e uma classe utiliza a palavra
reservada implements
public class NameClass implements NameInterface{//body class}
o Uma classe herdeira deve implementar todos os métodos da interface
o Uma classe que implementa uma interface é chamada de implementor
<<Interface>>
Interfaces Shape2D

o Exemplo + Ponto2D center()


+ double area()
o Interface Shape2D + double perimeter()

o Três métodos
Circle Rectangle
o Classes: Circle e Rectangle - center: Ponto2D - leftBot: Ponto2D
- rightTop: Ponto2D
o Implementam a interface - radius: double
+ Circle() + Rectangle()
+ toString() + toString()
o Usam a classe Ponto2D (agregação) + center() + center(int)
+ area() + area(int)
+ perimeter() + perimeter()
+ edgeX(int)
o Note o uso de Polimorfismo na classe + edgeY(int)

DemoShape2D Ponto2D
- x, y: double
+ Ponto2D()
+ toString()
+ getX(int)
+ getY(int)
Interfaces em Python
o Interfaces são classes abstratas, geralmente sem atributos
o Interfaces definem métodos a serem implementados pelas classe
descendentes
o Python não possui uma sintaxe exclusiva ou recursos específicos que
permitam criar interfaces
o Entretanto, podemos criar classes que se comportem como interfaces
o Mecanismos para criar interfaces em Python
o Utilizar o módulo ABC (Abstract Basic Class), ver exemplo anterior
o Criar uma classe que dispare uma exceção se o método não for
sobrescrito nas classes derivadas

o Exemplo: InterfaceByException
Classe Abstratas vs Interfaces https://history-computer.com/abstract-class-vs-interface/
Classe Abstratas vs Interfaces https://history-computer.com/abstract-class-vs-interface/
Herança Múltipla
o Herança, uma característica das linguagens orientadas a objetos
o Herança simples
o Herança múltipla
o Uma subclasse pode herdar de duas ou mais superclasses
o Uma classe pode herdar características e comportamentos de mais de
uma classe ancestral
Herança Múltipla
o A herança múltipla é vista com reservas por múltiplas linguagens
o O uso de herança múltipla impõe a necessidade de resolver alguns problemas:
o Ordem na chamada dos construtores das classes ancestrais
o Resolução da referencia a classe
ancestral ao acessar métodos de
classes ancestrais (super)
o Ambiguidade associada ao
problema do diamante
▪ Associado a atributos
▪ Associado a métodos: duas
superclasses tem um método
idêntico com implementações
diferentes, qual implementação
deve ser utilizada pela subclase
Herança Múltipla
o O problema do diamante é resolvido de formas diferentes em cada implementação
de POO, entre as alternativas temos:
o Forçar a subclasse a escolher uma das implementações
o Forçar a subclasse a reimplementar o método ambíguo
o Estabelecer um critério de importância ou especificidade que permita resolver a
ambiguidade (Python)
o Incluir novos construtores com restrições implícitas como as interfaces (Java)
Herança Múltipla - Java
o Ao fazermos herança, uma classe pode herdar:
o Estender uma única classe (concreta ou abstrata)
o Implementar uma ou múltiplas interfaces
o Estender uma classe e implementar múltiplas interfaces

o Uma classe que implementa múltiplas interfaces deve implementar todos os


métodos presentes nas interfaces
o Ao instanciarmos um objeto desta classe temos:
o Uma instancia da classe
o Uma instancia de cada interface
Herança Múltipla - Java
<<Interface>> <<Interface>>
o Exemplo: CirculoScalavel Shape2D Scalavel
o Convertemos a classe abstrata + Ponto2D center() + changeSize(double)
Shape2D em uma interface + double area() + reflectShape()
+ double perimeter()
o Adicionamos uma nova
interface com os
comportamentos escaláveis
CircleScalavel
o A subclasse deve implementar
- center: Ponto2D
todos os métodos presentes Ponto2D
- radius: double
nas interfaces - x, y: double + Circle()
+ Ponto2D() + toString()
+ toString(int) + center()
+ getX(int) + area()
+ getY(int) + perimeter()
+ changeSize(double)
+ reflectShape()
Herança Múltipla - Java
o Os atributos em interfaces são static e final, se desejamos atributos
modificáveis em uma classe derivada devemos usar classes abstratas

o Conflitos em herança múltipla


o De atributos
o Se múltiplas interfaces declaram o mesmo atributo, elas não poderão
ser utilizadas em herança múltipla, erro de compilação

o De métodos
o Se múltiplas interfaces declaram o mesmo método (nome, tipo de
retorno e parâmetros), elas podem ser utilizadas em uma herança
múltipla
o Apenas uma implementação do método poderá ser realizada nas
classes derivadas
Herança Múltipla em Python
o O mecanismo de herança múltipla permite criar uma classe herdando os
atributos e métodos de múltiplas classes
o Formalmente em Python não temos interfaces, então a herança múltipla
envolve classes comuns
o Não existe um limite para o número de classes que podem ser combinadas
para criar uma nova classe
o Exemplo: CircleScalavel herdando das classes Shape2D e Scalavel
o Resolução de conflitos em Python
o Atributos: os conflitos em atributos devem ser evitados
o Métodos: a resolução de conflitos envolve o mecanismo MRO (Method
Resolution Order)
o Detalhes: https://www.geeksforgeeks.org/multiple-inheritance-in-python/

Você também pode gostar