𝗔𝗯𝘀𝘁𝗿𝗮𝗰𝘁: 𝗮 𝗱𝗶𝗳𝗳𝗲𝗿𝗲𝗻𝘇𝗮 𝗱𝗲𝗹 𝘀𝗶𝗴𝗻𝗶𝗳𝗶𝗰𝗮𝘁𝗼, 𝗮𝗶𝘂𝘁𝗮 𝗰𝗼𝗻𝗰𝗿𝗲𝘁𝗮𝗺𝗲𝗻𝘁𝗲 𝗮 𝗿𝗶𝗱𝘂𝗿𝗿𝗲 𝗹𝗲 𝗽𝗼𝘀𝘀𝗶𝗯𝗶𝗹𝗶𝘁𝗮̀ 𝗱𝗶 𝗲𝗿𝗿𝗼𝗿𝗲.

Definire abstract la proprietà model:

a differenza del significato, aiuta concretamente a ridurre le possibilità di errore.

Attenzione, la lettura delle righe che seguono è per gli appassionati di codice, i nerd dei file .ts che sanno convertire frasi in classi.

Ok, se il titolo può sembrare criptico a un occhio neofita, appare lapalissiano a chi è più allenato in materia di classi. Eh sì, ci sono solo 10 tipi di persone in grado di ottenere una Ford T: chi pronuncia questa frase e chi lo fa convertendola in una classe, come ha fatto la nostra Simona oggi.

“Any customer can have a car (Ford T) painted any colour that he wants so long as it is black“, ovvero, “ogni cliente può ottenere una Ford T colorata di qualunque colore desideri, purché sia nero” è quanto scritto da Henry Ford in una sua biografia “My Life and Work“(1922).

Convertiamo l’asserzione in una classe (file .ts) che ci permette di ordinare l’auto.
export class FordCar {
private color: string = “black”;
private model: string = “Ford T”;

order() {
console.log(`You’ve ordered a ${this.color} ${this.model}`);
}
}

const car = new FordCar();
car.order(); -> You’ve ordered a black Ford T

Ben presto sul mercato viene immesso un nuovo modello (Ford A). Ora vogliamo poterlo ordinare
export class FordCar {
private color: string = “black”;
model: string = “”;

order() {
console.log(`You’ve ordered a ${this.color} ${this.model}`);
}
}

const car = new FordCar();
car.model = “Ford T”
car.order(); -> You’ve ordered a black Ford T
car.model = “Ford A”
car.order(); -> You’ve ordered a black Ford A
car.model = “Ford TA” // errore di digitazione
car.order(); -> You’ve ordered a black Ford TA???

Rendere pubblico la proprietà model ci permette di ordinare un modello di auto non commercializzato (Ford TA). Utilizzando l’ereditarietà si avrà:

export class FordCar {
private color: string = “black”;
model: string = “”;

order() {
console.log(`You’ve ordered a ${this.color} ${this.model}`);
}
}
export class FordTCar extends FordCar {
model: string = “Ford T”;
}
export class FordACar extends FordCar {
model: string = “Ford A”;
}

let fordCar = new FordTCar();
fordCar.order(); -> You’ve ordered a black Ford T

fordCar = new FordACar();
fordCar.order(); -> You’ve ordered a black Ford A
fordCar = new FordCar();
fordCar.model = “Ford TA” // errore di digitazione
fordCar.order(); -> You’ve ordered a black Ford TA???

Anche questa implementazione ci permette di ordinare un modello di auto non commercializzato (Ford TA). E… anche dichiarare protected la proprietà model non risolve il problema:
export class FordCar {
private color: string = “black”;
protected model: string = “”;

order() {
console.log(`You’ve ordered a ${this.color} ${this.model}`);
}
}
export class FordTCar extends FordCar {
protected model: string = “Ford T”;
}
export class FordACar extends FordCar {
protected model: string = “Ford A”;
}

let car: FordCar = new FordTCar();
car.order(); -> You’ve ordered a black Ford T
car = new FordACar();
car.order(); -> You’ve ordered a black Ford A
car = new FordCar();
car.order(); -> You’ve ordered a black???

La scelta corretta è quella di definire abstract la proprietà model. Questo però implica che:

  • la classe base a sua volta deve essere definita abstract e quindi non se ne potrà creare un istanza;
  • le classi derivate dovranno obbligatoriamente assegnare un valore alla proprietà model.

abstract class FordCar {
private color: string = “black”;
protected abstract model: string;

order() {
console.log(`You’ve ordered a ${this.color} ${this.model}`);
}
}
export class FordTCar extends FordCar {
protected model: string = “Ford T”;
}
export class FordACar extends FordCar {
protected model: string = “Ford A”;
}

const fordTCar = new FordTCar();
fordTCar.order(); -> You’ve ordered a black Ford T
const fordACar = new FordACar();
fordACar.order(); -> You’ve ordered a black Ford A

Pronti a ordinare l’auto in qualche riga di codice?
Grazie alla nostra @Simona Giorgi , Fullstack Web Developer

Definire abstract la proprietà model:

a differenza del significato, aiuta concretamente a ridurre le possibilità di errore.

Attenzione, la lettura delle righe che seguono è per gli appassionati di codice, i nerd dei file .ts che sanno convertire frasi in classi.

Ok, se il titolo può sembrare criptico a un occhio neofita, appare lapalissiano a chi è più allenato in materia di classi. Eh sì, ci sono solo 10 tipi di persone in grado di ottenere una Ford T: chi pronuncia questa frase e chi lo fa convertendola in una classe, come ha fatto la nostra Simona oggi.

“Any customer can have a car (Ford T) painted any colour that he wants so long as it is black“, ovvero, “ogni cliente può ottenere una Ford T colorata di qualunque colore desideri, purché sia nero” è quanto scritto da Henry Ford in una sua biografia “My Life and Work“(1922).

Convertiamo l’asserzione in una classe (file .ts) che ci permette di ordinare l’auto.
export class FordCar {
private color: string = “black”;
private model: string = “Ford T”;

order() {
console.log(`You’ve ordered a ${this.color} ${this.model}`);
}
}

const car = new FordCar();
car.order(); -> You’ve ordered a black Ford T

Ben presto sul mercato viene immesso un nuovo modello (Ford A). Ora vogliamo poterlo ordinare
export class FordCar {
private color: string = “black”;
model: string = “”;

order() {
console.log(`You’ve ordered a ${this.color} ${this.model}`);
}
}

const car = new FordCar();
car.model = “Ford T”
car.order(); -> You’ve ordered a black Ford T
car.model = “Ford A”
car.order(); -> You’ve ordered a black Ford A
car.model = “Ford TA” // errore di digitazione
car.order(); -> You’ve ordered a black Ford TA???

Rendere pubblico la proprietà model ci permette di ordinare un modello di auto non commercializzato (Ford TA). Utilizzando l’ereditarietà si avrà:

export class FordCar {
private color: string = “black”;
model: string = “”;

order() {
console.log(`You’ve ordered a ${this.color} ${this.model}`);
}
}
export class FordTCar extends FordCar {
model: string = “Ford T”;
}
export class FordACar extends FordCar {
model: string = “Ford A”;
}

let fordCar = new FordTCar();
fordCar.order(); -> You’ve ordered a black Ford T

fordCar = new FordACar();
fordCar.order(); -> You’ve ordered a black Ford A
fordCar = new FordCar();
fordCar.model = “Ford TA” // errore di digitazione
fordCar.order(); -> You’ve ordered a black Ford TA???

Anche questa implementazione ci permette di ordinare un modello di auto non commercializzato (Ford TA). E… anche dichiarare protected la proprietà model non risolve il problema:
export class FordCar {
private color: string = “black”;
protected model: string = “”;

order() {
console.log(`You’ve ordered a ${this.color} ${this.model}`);
}
}
export class FordTCar extends FordCar {
protected model: string = “Ford T”;
}
export class FordACar extends FordCar {
protected model: string = “Ford A”;
}

let car: FordCar = new FordTCar();
car.order(); -> You’ve ordered a black Ford T
car = new FordACar();
car.order(); -> You’ve ordered a black Ford A
car = new FordCar();
car.order(); -> You’ve ordered a black???

La scelta corretta è quella di definire abstract la proprietà model. Questo però implica che:

  • la classe base a sua volta deve essere definita abstract e quindi non se ne potrà creare un istanza;
  • le classi derivate dovranno obbligatoriamente assegnare un valore alla proprietà model.

abstract class FordCar {
private color: string = “black”;
protected abstract model: string;

order() {
console.log(`You’ve ordered a ${this.color} ${this.model}`);
}
}
export class FordTCar extends FordCar {
protected model: string = “Ford T”;
}
export class FordACar extends FordCar {
protected model: string = “Ford A”;
}

const fordTCar = new FordTCar();
fordTCar.order(); -> You’ve ordered a black Ford T
const fordACar = new FordACar();
fordACar.order(); -> You’ve ordered a black Ford A

Pronti a ordinare l’auto in qualche riga di codice?
Grazie alla nostra @Simona Giorgi , Fullstack Web Developer