Classi astratte


Java Sun

Earthweb
(ex Gamelan)

Jars

Java Boutique

JavaWorld

PIP






  JSem: 3.3

   Può essere utile certe volte definire una superclasse che dichiara una determinata struttura senza però fornire un'implementazione completa dei vari metodi. La struttura verrà condivisa dalle sottoclassi e ogni sottoclasse implementerà in modo specifico i vari metodi. Una tale superclasse sarà definita come abstract.
La sintassi per una dichiarazione di classe astratta è:
abstract class A{
Una classe astratta avrà dei metodi astratti cioè non definiti, ogni sottoclasse dovrà definire questi metodi nel modo più opportuno. La classe astratta serve solo a dare la struttura generale dando una lista di metodi che ogni sottoclasse dovrà implementare in qualche modo. La sintassi per dichiarare un metodo astratto è:

abstract tipo di ritorno nome(elenco parametri);
non si mette nessun corpo, neanche {}.

Una classe astratta può contenere metodi concreti.
Non vi possono essere oggetti di una classe astratta (non essendo i metodi definiti, la classe è "incompleta"), quindi una classe astratta non può essere istanziata con l'operatore new.
Ogni sottoclasse di una classe astratta deve definire tutti i metodi astratti della sua superclasse (o essere anch'essa dichiarata astratta).
L'esempio standard è quello di una classe Forme; ogni forma avrà un metodo paint e un metodo area, ovviamente tali metodi dipendono dalla natura della forma (rettangolo, triangolo,...), a questo livello di astrazione, non possiamo dare dettagli, perciò lascieremo questi metodi vuoti dichiarandoli abstract, poi ogni classe si occuperà di fornire i dettagli.

import java.awt.Graphics;

abstract class Forme{

int x,y;
String s = "Nome";

//costruttore

Forme(int x, int y){
	this.x = x;
	this.y = y;
	}
//metodo concreto Nome

String Nome(){
	return s;
	}
//metodo astratto
abstract void draw(Graphics g);

//metodo astratto
abstract double area();

}//fine della classe

La classe dei rettangoli:

import java.awt.Graphics;

public class Rett extends Forme{
	

//costruttore
Rett(int x, int y){
	super(x, y);
	}
//implementazione metodo draw
void draw(Graphics g){
	g.drawRect(5, 5, x, y);
	}
//implementazione metodo area
double area(){
	return x*y;
}
//metodo Nome
String Nome(){
	super.s = "Rettangolo";
	return s;
	}
}

quella dei triangoli rettangoli:

import java.awt.Graphics;

public class RTriangle extends Forme{
	

//costruttore

RTriangle(int x, int y){
	super(x,y);
	}
//implementazione metodo draw
void draw(Graphics g){
	g.drawLine(50,50,x+50,50);
	g.drawLine(50,50,50,y+50);
	g.drawLine(x+50,50,50,y+50);
	}
//implementazione metodo area
double area(){
	return (x*y)/2;
}
//metodo Nome
String Nome(){
	super.s = "Triangolo rettangolo";
	return s;
	}
}

Per vedere queste classi all'opera:

import java.awt.*;
import java.applet.*;

public class EsAstr extends Applet{

Rett R = new Rett(30,20);
RTriangle T = new RTriangle(40,20);
/*Forme F = new Forme(); ERRORE, la classe astratta Forme 
non può essere istanziata*/


public void paint(Graphics g){
	R.draw(g);
	T.draw(g);
	g.drawString("Area di R= " + R.area(),10,90);
	g.drawString("Area di T= " + T.area(),10,110);
	g.drawString("Nome di R: " + R.Nome(),10,130);
	g.drawString("Nome di T: " + T.Nome(),10,150);
	}
}

Un esempio di classe astratta: la classe Graphics di java.awt; in particolare non è possibile istanziare un oggetto Graphics; la classe Component (e quindi tutte le sue sottoclassi) dispone del metodo getGraphics() che permette di ottenere un contesto grafico.




 next		content		previous