Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Tema11 Abstratas Interfaces

Fazer download em pdf ou txt
Fazer download em pdf ou txt
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