Você está na página 1de 32

CC3642

Orientação a Objetos
Prof. Danilo H. Perico
Metaclasses

2
Metaclasses

● Em orientação a objetos, uma metaclasse é uma classe cujas


instâncias também são classes e não objetos
● Assim como classes definem o comportamento de certos objetos,
metaclasses definem o comportamento de certas classes e suas
instâncias

3
Metaclasses

● Em Java só existe uma metaclasse: Class


● A instância genérica de Class é a classe Object
● Todas as classes em Java herdam de Object
● Qual vantagem?

4
Metaclasses

● Exemplo!

5
Reflection

● Reflection (Reflexão):
○ A ideia é que o programa possa analisar e manipular a si
próprio!
○ Ele pode se ver como se fosse um reflexo em um espelho

6
Reflection

● Reflection (Reflexão):
○ Com reflexão podemos descobrir a classe de um objeto, os
modificadores de acesso, métodos, atributos, etc.
○ Podemos também criar instâncias da classe, invocar um
método da classe, etc.

7
Reflection

● Para se obter informações de uma classe, precisamos do objeto


Class
○ Exemplo:
■ Objeto: fulano (da classe Pessoa)
■ Class p = fulano.getClass( );

8
Reflection

● Existem várias outras formas de se obter a classe, depende da


informação que você tem. Objeto: fulano (da classe Pessoa)
○ Class p = Pessoa.class; //se souber o nome da classe em tempo de compilação
○ Class p = class.forName(String); // se souber o nome da classe em tempo de
execução como String

9
Reflection

● Com o objeto de Class, podemos examinar a classe com mais


detalhes: Não Públicos:

○ getFields(); ○ getDeclaredFields();

○ getConstructors(); ○ getDeclaredMethods();

○ getMethods();

https://www.oracle.com/technical-resources/articles/java/javareflection.html
10
Reflection

● Exemplo: Depois que usamos o getMethods() para saber quais são


os métodos de uma classe, podemos usar os outros seguintes
métodos para mais informações:
○ getName();
○ getModifiers();
○ getParameterTypes();
○ getReturnType()
○ toString()
○ invoke(Object, args...)
11
Metaclasses

● Exemplo!

12
Orientação a Objetos em outras
Linguagens de Programação

13
C++ - Classe e Herança

14
Python

15
POO no Python
POO no Python

cria o objeto
da classe
Aluno
POO no Python

executa o
método do
objeto aluno
POO no Python - Construtor
No Python o método construtor da classe é chamado de __init__

construtor:
inicializa o valor
dos atributos
quando o objeto é
instanciado
POO no Python - Herança
Sobrecarga de Operadores

21
Sobrecarga de Operadores

● Redefinição do significado do operador para tipos diferentes dos


definidos previamente.
● Permite utilizar operadores diretamente para objetos de classes

22
Sobrecarga de Operadores

● O Java não tem Sobrecarga de Operadores


● Podemos fazer o que gostariamos com um método comum

23
Sobrecarga de Operadores

● Exemplo em Java!

24
Sobrecarga de Operadores

● Outras Linguagens tem esse recurso, como o C++


● Exemplos!

25
Exemplo

26
Operadores que podem ser sobrecarregados

27
Operadores que não podem ser sobrecarregados

28
Exemplo: Números Complexos

● C++ não suporta números complexos primitivamente


● Classe Complexo para lidar com números complexos

29
30
Exemplo: Quantos retângulos cabem dentro
de outro?
● Faça uma classe retângulo com atributos para largura e comprimento
● Faça um método para cálculo de área em sua classe
● Modifique o operador / (divisão) para retornar a quantidade de retângulos
menores que cabem dentro de um retângulo maior
● main():

31
Fim

32

Você também pode gostar