Herança PII

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 35

EN05170 - Programação de Computadores II

Herança
Prof. Dr. Lidio Mauro Lima de Campos
[email protected]

Universidade Federal do Pará – UFPA


ICEN
PPGCC
1
Agenda
•Introdução
•Herança
Usando super acessar membros da superclasse
// Usando super para resolver o problema da ocultação de nomes
class A { int i;}.
class B extends A // Cria uma subclasse estendendo a classe A
{ int i; // Essa variável i oculta a variável i de A
B(int a, int b)
{ super.i = a; // i de A
i = b; // i de B
}
void show()
{ System.out.println("i na superclasse: " + super.i);
System.out.println("i na subclasse: " + i);
}}
Usando super acessar membros da superclasse
// Usando super para resolver o problema da ocultação de nomes
class UseSuper {
public static void main(String args[]) {
B subOb = new B(1, 2);
subOb.show();
}
}
Criando uma Hierarquia de Vários Níveis
Criando uma Hierarquia de Vários Níveis
EX5:// Uma hierarquia multinivel

class TwoDShape
{
private double width; private double height;
// Um construtor padrão
TwoDShape() {width = height = 0.0;}
// Construtor Parametrizado
TwoDShape(double w, double h)
{width = w; height = h; }
// Construtor que inicializa comprimento e altura com mesmo valor
TwoDShape(double x)
{width = height = x; }
// Métdos acessadores comprimento e altura.
...............................
}
Criando uma Hierarquia de Vários Níveis
EX5:// Uma hierarquia multinivel

class TwoDShape
{ ...............................
// Métdos acessadores comprimento e altura.
double getWidth() { return width; } double getHeight() { return height; }
void setWidth(double w) { width = w; } void setHeight(double h) { height
= h; }

void showDim()
{ System.out.println("Width and height are " + width + " and " + height); }
}
Criando uma Hierarquia de Vários Níveis
class Triangle extends TwoDShape
{
private String style;
// Um construtor padrão.
Triangle() { super(); style = "none";
}
Triangle(String s, double w, double h) {
super(w, h); // chama o construtor da superclasse
style = s;
}
// Um construtor de argumento único
..........} }
Criando uma Hierarquia de Vários Níveis
class Triangle extends TwoDShape
{ ..........
// Um construtor de argumento único
Triangle(double x) {
super(x); // chama o construtor da superclasse
style = "filled";
}
double area() { return getWidth() * getHeight() / 2; }

void showStyle() {
System.out.println("Triangle is " + style);
}}
Criando uma Hierarquia de Vários Níveis
// Herda de Triangulo

class ColorTriangle extends Triangle


{
private String color;

ColorTriangle(String c, String s, double w, double h)


{
super(s, w, h);
color = c;
}
..............................
}
Criando uma Hierarquia de Vários Níveis
// Herda de Triangulo

class ColorTriangle extends Triangle


{
.............................................
String getColor() { return color; }

void showColor()
{
System.out.println("Color is " + color);
}
}
Criando uma Hierarquia de Vários Níveis
class Shapes {
public static void main(String args[]) {
ColorTriangle t1 = new ColorTriangle("Blue", "outlined", 8.0, 12.0);
ColorTriangle t2 = new ColorTriangle("Red", "filled", 4.0, 2.0);

System.out.println("Info for t1: ");


t1.showStyle();
t1.showDim();
t1.showColor();
System.out.println("Area is " + t1.area());
....................................................
}}
Criando uma Hierarquia de Vários Níveis

class Shapes {
public static void main(String args[]) {
..........................

System.out.println("Info for t2: ");


t2.showStyle();
t2.showDim();
t2.showColor();
System.out.println("Area is " + t2.area());
}
}
Quando os Construtores são Chamados?

• Em uma hierarquia de classes, os construtores


concluem sua execução em ordem de derivação, da
superclasse para a subclasse.
• Se super() não for usada, o construtor padrão (sem
parâmetros) de cada superclasse será executado.
Referências da superclasse e objetos da subclasse
class X
{ int a;
X(int i) { a = i; }
}

class Y extends X {
int b;
Y(int i, int j) {
super(j);
b = i;}
}
Referências da superclasse e objetos da subclasse

class SupSubRef {
public static void main(String args[]) {
X x = new X(10);
X x2;
Y y = new Y(5, 6);
x2 = x; // OK, ambos do mesmo tipo
System.out.println("x2.a: " + x2.a);
........................................
}
}
Referências da superclasse e objetos da subclasse
class SupSubRef {
public static void main(String args[]) {
.........................................
// Referências de X só conhecem membros de X
x2.a = 19; // OK
//x2.b = 27; // Erro, Não tem um membro b
}
}
Voltando ao Projeto Banco

• Seria interessante que o nosso “banco” oferecesse outros tipos de Conta?

• Poderíamos imaginar contas corrente, contas poupança e contas especiais;

• Qual seria diferença entre essas contas?


Projeto Banco
• Classe Conta Corrente
• Métodos: Creditar, Debitar, getSaldo, getNumero,
setNumero
• Propriedades: saldo, numero
• Classe Conta Poupança
• Métodos: Creditar, Debitar, getSaldo, getNumero,
setNumero, render juros.
• Propriedades: saldo, numero.
• Classe Conta Especial
• Métodos: Creditar, Debitar, getSaldo, getNumero,
• setNumero, getLimite, setLimite.
Representação UML
Projeto Banco
• Objetos da subclasse comportam-se como objetos da
superclasse;
ContaPoupanca poupanca = new
ContaPoupanca();
ContaCorrente conta = poupanca;
conta.creditar( 1000 );
poupanca .debitar( 500 );
Projeto Banco
• Algumas operações da superclasse podem ser
redefinidas na subclasse (extensibilidade);
• Um bom exemplo disso é a classe conta especial, onde
o método de debitar deverá testar se o saldo e o limite
de crédito não foram excedidos (na conta corrente só
é considerado o saldo);
• Estamos especializando o método debitar.
Herança
• Java só suporta herança simples, ou seja, uma classe só pode herdar
de uma única outra classe – só pode ter um pai.
• Qualificador protected: visibilidade restrita à classe e às subclasses;
• Construtores não são herdados;
Projeto Banco
• Para definir a herança em no caso das duas novas contas usa-se a :

• Subclasse “extends” Superclasse ;


public class ContaPoupanca extends ContaCorrente
{
...
}
Herança
• Anatomia de uma subclasse em Java
• [public] class <nome da classe> [ extends]<classe pai> ]
{
[ public/protected/private] [final][static]
<DADOS>
[ public/protected/private] [static] [abstract]
<MÉTODOS>
•}
Projeto Banco
public class ContaCorrente
{ private String numero;
protected double saldo;
public ContaCorrente( String numero, double saldo )
{this .numero = numero; this.saldo = saldo; }

public void creditar( double valor )


{ saldo += valor; }
......................
}
Projeto Banco
public class ContaCorrente
{ ...................
public void debitar( double valor )
{ if ( saldo >= valor ) { saldo -= valor; } }
... (métodos get e set)
}
Projeto Banco
public class ContaPoupanca extends ContaCorrente
{
private final double TAXA_JUROS = 0.01;
public void renderJuros()
{
double juros = (getSaldo() * (TAXA_JUROS) );
creditar( juros );
}
}
Projeto Banco
public class ContaEspecial extends ContaCorrente
{
private final double LIMITE_CREDITO = 1000;
public void debitar( double valor )
{
if ( saldo+LIMITE_CREDITO >= valor )
{
saldo -= valor;
}
}
}
Herança
• Comportamento
Objetos da subclasse comportam-se como os objetos da
superclasse
• Substituição
Objetos da subclasse podem ser usados no lugar de objetos
da superclasse
Herança
Objetos da subclasse podem ser usados no lugar de objetos da
superclasse
...
ContaCorrente cc = new ContaPoupanca( “123”, 1000 );
cc.creditar( 500 ); //da superclasse pois são herdados
cc.debitar( 200 ); //da superclasse pois são herdados
System.out.println( cc. getSaldo() ); //da superclasse
...
Herança debitar();

• Verificação dinâmica
debitar();
...
ContaEspecial ce = new ContaEspecial( “123”, 1000 );
banco. adicionarConta(ce);
ContaCorrente cc = banco.obterConta( “123” );
cc.debitar( 1500 ); // método da superclasse
...
cc é do tipo conta corrente e por substituição aponta para
um objeto da subclasse (conta especial)
Herança
• Verificação de tipos com instanceof
...
ContaEspecial ce = new ContaEspecial( “123”, 1000 );
banco.adicionarConta( ce );
ContaCorrente cc = banco. obterConta( “123” );
if ( cc instanceof ContaEspecial )
{ System.out.println(“Cuidado com o limite!” ); }
...
cc é do tipo conta corrente e por substituição aponta para um
objeto da subclasse (conta especial), logo:
if ( cc instanceof ContaEspecial ) == F
Herança
• Conversões (casts)
...
ContaPoupanca cp = new ContaPoupanca( “123”, 1000 );
banco.adicionarConta( cp );
ContaCorrente cc = banco.obterConta( “123” );
((ContaPoupanca) cc ).renderJuros(); //pois o método render
juros é definido na subclasse
Herança - Exercício
• Crie as classes ContaEspecial e ContaPoupanca;
• Verifique se é necessário alterar a classe Banco
para suportar os novos tipos de classe criados;
• Permita ao usuário cadastrar os novos tipos de
conta.

Você também pode gostar