Ciò che abbiamo visto prima è utile per piccole applicazioni. Cosa succede se dobbiamo realizzare applicazioni ed applet più complesse? Abbiamo la necessità di dichiarare classi, campi, metodi e di creare oggetti. Per esempio, consideriamo il seguente caso: vogliamo scrivere una semplice Applet che legga un parametro di tipo stringa (fornito da PARAM) e lo scriva sullo schermo in bianco su uno sfondo rosso. Vediamo quello che ci serve.
Vogliamo creare un file class che deve essere usato come un'applet da un browser. Dobbiamo estendere la classe java.applet.Applet e, quindi, scriviamo ciò che segue:
Java/* This is MyApplet.java */
import java.applet.Applet;
public class MyApplet extends Applet {
//... list of fields and methods
}
|
NetRexx/* This is MyApplet.nrx */ class MyApplet extends Applet --... list of properties and methods -- -- |
note
| |
|
CLASS Instruction Sintax
class class_name [private|public|shared] [abstract|final|interface|adapter] [binary] visibility
private visibile al package corrente (default per tutte le altre classe di un file) shared visibile al package corrente (esattamente come private) modifiers
abstract alcuni metodi sono astratti interface tutti i metodi sono astratti e le proprietà sono costanti adapter implementa (automaticamente) tutti i metodi astratti ereditati binary forza l'uso di tipi nativi extends identifica la superclasse uses elenca le classi sorgenti di proprietà e metodi statici implements elenca le interfacce ereditate | |
Ora aggiungiamo un campo all'Applet. Nel metodo init leggiamo il parametro MSG e memorizziamo il suo valore in una variabile.
Java/* This is MyApplet.java */
import java.applet.Applet;
public class MyApplet extends Applet {
String message;
//... list of methods
}
|
NetRexx/* This is MyApplet.nrx */ class MyApplet extends Applet message=String -- inheritable by default --... list of methods -- -- |
notes
| |
|
PROPERTIES Instruction Sintax properties [public|inheritable|private|shared] [constant|static|volatile|transient|indirect]; visibility
inheritable visibile all'interno del package corrente ed alle classi che estendono la classe corrente (default) shared visibile all'interno del package corrente ma non ereditato dalle classi che estendono la classe corrente private visibile solo all'interno della classe corrente modifiers
static proprietà alterabile della classe volatile può cambiare in modo asincrono transient non è salvata quando l'oggetto è serializzato indirect è accessibile per mezzo di metodi get-set generati automaticamente (convenzioni JavaBeans) | |
Infine, abbiamo bisogno del metodo init() (per inizializzare la variabile message leggendo il parametro MSG) e del metodo paint(Graphics g) (per mostrare il messaggio).
Java/* This is MyApplet.java */
import java.applet.Applet;
public class MyApplet extends Applet {
String message;
public void init() {
setBackground(Color.red);
setForeground(Color.white);
message = getParameter("MSG");
}
public void paint(Graphics g) {
g.drawString(message,10,10);
}
}
|
NetRexx/* This is MyApplet.nrx */
class MyApplet extends Applet
message=String
method init
setBackground(Color.red)
setForeground(Color.white)
message=getParameter("MSG")
method paint(g=Graphics)
g.drawString(message,10,10)
--
--
--
--
|
| |
|
METHOD Instruction Sintax
method method_name[([argument_name[,...]])] visibility
inheritable visibile all'interno del package corrente ed alle classi che estendono la classe corrente (default) shared visibile all'interno del package corrente ma non ereditato dalle classi che estendono la classe corrente private visibile solo all'interno della classe corrente modifiers
final non può essere sovraccaricato constant static e final abstract non implementato native implementato esternamente protect protegge l'oggetto corrente (sincronizzazione) returns definisce il tipo restituito (per default NetRexx String) signal elenca le eccezioni che possono essere lanciate | |
Il poter specificare dei valori di default per gli argomenti è una utile caratteristica del C++. Java non la possiede, ma il NetRexx sì. Immaginiamo che una classe abbia spesso bisogno di passare lo stesso argomento ad uno dei suoi metodi. Con Java è possibile aggiungere un'altro metodo con lo stesso nome che usi un valore di default e richiami il metodo originale, in caso contrario si è obbligati a passare lo stesso velore ogni volta che è necessario. Con il NetRexx è sufficiente dichiarare quel valore nella lista degli argomenti. Per esempio consideriamo una classe Sphere che deve essere ridimensionata (spesso di un fattore due):
Java/* This is Sphere.java */
public class Sphere {
private float radius = 1.0;
Sphere(float radius) {
this.radius = radius;
}
public void Scale(float factor) {
radius *= factor;
}
public void Scale() {
Scale(2.0);
}
}
// In another class
Sphere sph = new Sphere();
sph.Scale(); // doubles the radius
sph.Scale(0.5); // halves the radius
|
NetRexx/* This is Sphere.nrx */
class Sphere
properties private
radius
method Sphere(radius=1.0)
this.radius=radius
method Scale(factor=2.0)
radius = radius * factor
--
--
--
--
--
-- In another class
sph=Sphere
sph.Scale -- doubles the radius
sph.Scale(0.5) -- halves the radius
|
| |
Un metodo restituisce un valore per mezzo della parola chiave return. Per esempio, riscriviamo la classe Sphere in modo che sia maggiormente configurabile:
Java/* This is Sphere.java */
public class Sphere {
private float radius = 1.0;
public Sphere(float r) {
radius = r;
}
public float getRadius() {
return radius;
}
public void setRadius(float r) {
radius = r;
}
}
|
NetRexx/* This is Sphere.nrx */
class Sphere
properties private
radius
method Sphere(r=1.0)
radius=r
method getRadius
return radius
method setRadius(r)
radius=r
--
--
--
|
NetRexx (experimental)/* This is Sphere.nrx */
class Sphere
properties indirect
radius
method Sphere(r=1.0)
radius=r
--
--
--
--
--
--
--
|
| ||
Gli oggetti sono creati utilizzando metodi speciali chiamati costruttori. I costruttori, come in Java, hanno lo stesso nome della classe. Le istanze di una classe (gli oggetti) sono create senza l'uso della parola chiave new e, come nei metodi normali, gli argomenti possono avere valori di default.
Java/* Examples of new Java objects */ Vector v1 = new Vector(); // empty Vector Vector v2 = new Vector(10); // with capacity |
NetRexx/* Examples of new NetRexx objects */ v1=Vector() -- an empty Vector v2=Vector(10) -- with capacity |
| |
[Indice] [Capitolo precedente] [Capitolo successivo]
hosted by