Programao Orientada a Objetos Interfaces Prof Isabel Cafezeiro
Programação Orientada a Objetos* Interfaces Prof. Isabel Cafezeiro isabel@dcc. ic. uff. br http: //www. dcc. ic. uff. br/~isabel *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC
Interfaces z Classes abstratas que possuem apenas métodos abstratos Na Interface: y. Métodos são implicitamente abstract e public y. Campos são implicitamente static e final y. Não possuem construtores assim como as classes abstratas, as interfaces não podem ser instanciadas.
Interfaces Objeto. Geométrico centro( ) calculaÁrea( ) calcula. Perímetro( ) Circulo raio centro Circulo(c, r){. . . } centro( ) {. . . } calculaÁrea( ) {. . . } calcula. Perímetro( ) {. . . } to. String( ) {. . . } Retangulo primeiro. Canto segundo. Canto Retangulo(pc, sc){. . . } centro( ) {. . . } calculaÁrea( ) {. . . } calcula. Perímetro( ) {. . . } to. String( ) {. . . }
Interfaces interface Objeto. Geometrico declaração diferente de classes { Ponto 2 D centro(); double calculaÁrea(); métodos sem modificadores abstract double calcula. Perímetro(); e public } // fim da interface Objeto. Geometrico É possível fazer o uso de outras classes na assinatura dos métodos. Objeto. Geométrico. java
Interfaces class Circulo implements Objeto. Geometrico { private Ponto 2 D centro; private double raio; Circulo(Ponto 2 D centro, double raio) { this. centro = centro; this. raio = raio; } public Ponto 2 D centro() { return centro; } public double calculaÁrea() { return Math. PI*raio; } public double calcula. Perímetro() { return 2. 0*Math. PI*raio; } public String to. String() { return "Círculo com centro em "+centro+" e raio "+raio; } } // fim da classe Circulo Cláusula de herança Todos os métodos da interface são implementados. Devem ser sobrescritos com modificador public. Aula 10: private, protected ou modificador ausente tornariam o acesso mais restritivo. Aula 10: modificador static também não é permitido Circulo. java
Interfaces class Retangulo implements Objeto. Geometrico { private Ponto 2 D primeiro. Canto, segundo. Canto; Métodos da interface Retangulo(Ponto 2 D pc, Ponto 2 D sc) { implementados de forma diferente da classe Circulo primeiro. Canto = pc; segundo. Canto = sc; } public Ponto 2 D centro() { double coord. X = (primeiro. Canto. get. X()+segundo. Canto. get. X())/2. ; double coord. Y = (primeiro. Canto. get. Y()+segundo. Canto. get. Y())/2. ; return new Ponto 2 D(coord. X, coord. Y); } public double calculaÁrea() {. . . } public double calcula. Perímetro() {. . } public String to. String() { return "Retângulo com cantos "+primeiro. Canto+" e "+segundo. Canto; } } // fim da classe Retangulo. java
Interfaces class Demo. Objetos. Geometricos { A interface como parâmetro public static void main(String[] argumentos) { ou retorno de método: Circulo c 1 = new Circulo(new Ponto 2 D(0, 0), 100); instância de subclasse deverá Retangulo r 1 = new Retangulo(new Ponto 2 D(-2, -2), ser passada (Polimorfismo: new Ponto 2 D(2, 2)); aula 10). imprime. Todos. Os. Dados(c 1); imprime. Todos. Os. Dados(r 1); } private static void imprime. Todos. Os. Dados(Objeto. Geometrico og) { System. out. println(og); System. out. println("Perímetro: "+og. calcula. Perímetro()); System. out. println("Área: "+og. calculaÁrea()); System. out. println(); } } Demo. Objetos. Geometricos. java
Interfaces class Demo. Objetos. Geometricos. EPolimorfismo { Referências à interface. . public static void main(String[] argumentos) { Objeto. Geometrico o 1, o 2; . . apontando para instâncias das subclasses. o 1 = new Circulo(new Ponto 2 D(0, 0), 20); (Polimorfismo: aula 10). o 2 = new Retangulo(new Ponto 2 D(-1, -1), new Ponto 2 D(1, 1)); System. out. println("o 1 é um Círculo ? "+ (o 1 instanceof Circulo)); Verifique o 1 é System. out. println("o 1 é um Retângulo ? "+ círculo e também é (o 1 instanceof Retangulo)); objeto geométrico System. out. println("o 1 é um Objeto. Geometrico ? "+ (o 1 instanceof Objeto. Geometrico)); . . } } // fim da classe Demo. Objetos. Geometricos. EPolimorfismo. java
Interfaces e Herança Múltipla z Modelar Objetos Geométricos z Modelar Objetos escaláveis Nem todo objeto geométrico deve ser escalável !!! Nem todo objeto escalável deve ser geométrico !!!
Interfaces e Herança Múltipla Escalavel Objeto Geométrico Circulo Escalavel Toda subclasse neste nível é necessariamente Objeto Geométrico e escalável !!! Como fazer um objeto geométrico que não seja escalável ? ? ?
Interfaces e Herança Múltipla Objeto Geométrico Escalavel Circulo Este círculo não é escalável !!! Circulo Escalavel Mas e se for necessário definir outras classes que não sejam objetos geométricos e que sejam escaláveis? ?
Interfaces e Herança Múltipla z Objetos Geométricos z Objetos Escaláveis Características independentes !!! Nem todo objeto geométrico é escalável !!! Nem todo objeto escalável é geométrico !!!
Interfaces: Herança Múltipla “controlada” Objeto. Geométrico Escalável centro( ) calculaÁrea( ) calcula. Perímetro( ) amplia( e ) espelha( ) Circulo. Escalável raio centro Circulo. Escalável(c, r){. . . } centro( ) {. . . } calculaÁrea( ) {. . . } calcula. Perímetro( ) {. . . } amplia( e ) {. . . } espelha( ) {. . . } to. String( ) {. . . }
Interfaces interface Escalavel { void amplia(double escala); void espelha(); } // fim da interface Escalavel. java
Interfaces class Circulo. Escalavel implements Objeto. Geometrico, Escalavel { private Ponto 2 D centro; private double raio; Circulo. Escalavel(Ponto 2 D centro, double raio) { this. centro = centro; this. raio = raio; } public Ponto 2 D centro() { return centro; } public double calculaÁrea() { return Math. PI*raio; } public double calcula. Perímetro() { return 2. 0*Math. PI*raio; } public void amplia(double escala) { raio *= escala; } public void espelha() { centro = new Ponto 2 D(-centro. get. X(), centro. get. Y()); } public String to. String() { return "Círculo com centro em "+centro+" e raio "+raio; } } cláusula de herança múltipla Circulo. Escalavel. java
Conflitos em Herança Múltipla z Conflitos de métodos: y. As superclasses possuem métodos com mesma assinatura. Qual deles herdar? ? ? z Conflitos de campos: y. As superclasses possuem campos com mesmo nome. Qual deles herdar ? ? ?
Conflitos em Herança Múltipla z Solução de C++: herança seletiva z Solução de Java: interfaces y Não há conflito de métodos porque a sobrescrição é obrigatória nas classes herdeiras y O compilador detecta conflito de campos e não compila a classe herdeira.
Classes abstratas e interfaces Exercício: Objeto Geométrico Escalavel implements Circulo implements extends Circulo Escalavel É possível? Demo. Circulo. Escalável continua funcionando?
- Slides: 18