Costruttori di Classe in Dart (e Flutter) — parte 2
Riprendo la prima domanda della prima parte:
- come costruire una classe che eredita?
La classe che eredita anche in Dart utilizza extends
class Autovettura extends Veicolo{
}
La classe che estende non eredita mai il costruttore della classe padre, ma lo deve richiamare direttamente
class Autovettura extends Veicolo{ AutoVettura([String m, num c])
: super('', 0, 'autovettura')
{
if (m != null) this.marca = m;
if (c > 0) this.cilindrata = c;
}}
Questo tipo di costruzione ha in più :super('', 0, 'autovettura')
. Questa istruzione viene richiamata prima del body del costruttore e richiama il costruttore padre. In questo modo la classe padre viene inizializzata e gli attributi sono poi modificati nel corpo del costruttore.
Named constructor
I named constructor sono un tipo di costruttore particolare. Sono come factory method, anche se non lo sono in realtà.
Sono utilizzabili in qualsiasi classe.
Io le utilizzo ora nella sub class per mostrare altri modi di costruire la classe.
AutoVettura.fiat() : super('fiat', 500);AutoVettura.bmw() : this('BMW', 3000);
La prima riga definisce il named constructor fiat
che richiama il super contructor e lo inzializza.
La seconda riga definisce il named constructor bmw
che richiama il costruttore della classe Autoveicolo
e lo inizializza.
Quindi un metodo richiama il super, l’altro il metodo della classe
Ecco la classe Autovettura
:
class AutoVettura extends Veicolo { AutoVettura([String m, num c]) : super('', 0, 'autovettura') {
if (m != null) this.marca = m;
if (c > 0) this.cilindrata = c;
}
AutoVettura.bmw() : this('BMW', 3000);
AutoVettura.fiat() : super('fiat', 500);}
I named mathod possono avere un corpo. Ad esempio:
AutoVettura.fiat() : super('fiat', 500){ this.marca = 'FIAT'; }
Autovettura che estende Veicolo
Ecco l’esempio completo della prima parte e dell’attuale articolo:
class Veicolo {
String marca, tipo;
num cilindrata;
Veicolo([String m, num c, String t])
:this.marca = '',
this.cilindrata = 0,
this.tipo = ''
{
this.marca = m;
this.cilindrata = c;
this.tipo = t;
} @override
String toString() {
String tipo = this.tipo;
String marca = this.marca;
String cili = this.cilindrata.toString();
return 'Il veicolo è:' + ' $tipo - $marca ($cili cc)';
}
}class AutoVettura extends Veicolo { AutoVettura([String m, num c]) : super('', 0, 'autovettura') {
if (m != null) this.marca = m;
if (c > 0) this.cilindrata = c;
}
AutoVettura.bmw() : this('BMW', 3000);
AutoVettura.fiat() : super('fiat', 500);}
Per testarla velocemente:
main() {
Veicolo bmw = AutoVettura.bmw();
print(bmw.toString()); Veicolo fiat = AutoVettura.fiat();
print(fiat.toString()); Veicolo alfaromeo = new AutoVettura('Alfa Romeo', 2000);
print(alfaromeo.toString());}
Le prime due autovetture utilizzano un named method, l’autovettura alfaromeo costruisce l’autovettura da zero.
Questo è il risultato:
Il veicolo è: autovettura - BMW (3000 cc)
Il veicolo è: null - fiat (500 cc)
Il veicolo è: autovettura - Alfa Romeo (2000 cc)