Costruttori di Classe in Dart (e Flutter) — parte 2

Luigi Massa
2 min readApr 12, 2020

--

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)

--

--

Luigi Massa

SAP Professional Consultant, Symfony, PrestaShop, Python junior, React and EC6 entusiast developer, studying Machine Learning and mountain lover :P