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