TypeScript - Eredità
Ciao, futuri programmatori! Oggi ci imbarcheremo in un viaggio entusiasmante nel mondo dell'eredità di TypeScript. Come il vostro amico insegnante di informatica del quartiere, sono qui per guidarvi attraverso questo affascinante argomento. Allora, prendete i vostri zaini virtuali e tuffiamoci!
Cos'è l'Eredità?
Prima di iniziare, cerchiamo di capire cosa significa davvero l'eredità. Immagina di creare un albero genealogico. Ogni nuova generazione eredita determinate caratteristiche dai propri genitori. Nel programming, l'eredità funziona allo stesso modo. Permette a una nuova classe di essere basata su una classe esistente, ereditandone le proprietà e i metodi. Bello, vero?
Eredità Singola
Iniziamo con la forma più semplice di eredità: l'eredità singola. Questo è quando una classe (classe figlia) eredita da un'altra classe (classe padre).
Esempio di Base
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
makeSound(): void {
console.log("Some generic animal sound");
}
}
class Dog extends Animal {
breed: string;
constructor(name: string, breed: string) {
super(name);
this.breed = breed;
}
makeSound(): void {
console.log("Woof! Woof!");
}
}
let myDog = new Dog("Buddy", "Golden Retriever");
console.log(myDog.name); // Output: Buddy
console.log(myDog.breed); // Output: Golden Retriever
myDog.makeSound(); // Output: Woof! Woof!
In questo esempio, Dog
eredita da Animal
. La parola chiave extends
viene utilizzata per creare una classe che è figlia di un'altra classe.
Spiegazione
- Definiamo una classe base
Animal
con una proprietàname
e un metodomakeSound
. - Poi creiamo una classe
Dog
che estendeAnimal
. - La classe
Dog
ha la sua proprietàbreed
. - Utilizziamo la parola chiave
super
nel costruttore diDog
per chiamare il costruttore diAnimal
. - Sovrascriviamo il metodo
makeSound
nella classeDog
.
Parola Chiave Super
Potreste aver notato la parola chiave super
nel nostro esempio precedente. Esploriamo più a fondo cosa fa.
Esempio con Super
class Vehicle {
make: string;
model: string;
constructor(make: string, model: string) {
this.make = make;
this.model = model;
}
getInfo(): string {
return `${this.make} ${this.model}`;
}
}
class Car extends Vehicle {
numDoors: number;
constructor(make: string, model: string, numDoors: number) {
super(make, model);
this.numDoors = numDoors;
}
getInfo(): string {
return `${super.getInfo()} with ${this.numDoors} doors`;
}
}
let myCar = new Car("Toyota", "Corolla", 4);
console.log(myCar.getInfo()); // Output: Toyota Corolla with 4 doors
Spiegazione
- La parola chiave
super
viene utilizzata nel costruttore diCar
per chiamare il costruttore diVehicle
. - Nel metodo
getInfo
della classeCar
, utilizziamosuper.getInfo()
per chiamare il metodogetInfo
della classe padre.
La parola chiave super
ci permette di accedere e chiamare funzioni su un oggetto del padre.
Sovrascrittura del Metodo
La sovrascrittura del metodo si verifica quando una classe figlia fornisce una implementazione specifica di un metodo già definito nella sua classe padre. Abbiamo visto questo nei nostri esempi precedenti!
Un Altro Esempio di Sovrascrittura del Metodo
class Shape {
getArea(): number {
return 0;
}
}
class Circle extends Shape {
radius: number;
constructor(radius: number) {
super();
this.radius = radius;
}
getArea(): number {
return Math.PI * this.radius * this.radius;
}
}
class Rectangle extends Shape {
width: number;
height: number;
constructor(width: number, height: number) {
super();
this.width = width;
this.height = height;
}
getArea(): number {
return this.width * this.height;
}
}
let myCircle = new Circle(5);
console.log(myCircle.getArea()); // Output: 78.53981633974483
let myRectangle = new Rectangle(4, 5);
console.log(myRectangle.getArea()); // Output: 20
Spiegazione
- Abbiamo una classe base
Shape
con un metodogetArea
che restituisce 0. - Entrambe le classi
Circle
eRectangle
estendonoShape
e sovrascrivono il metodogetArea
con le loro proprie implementazioni. - La classe
Circle
calcola l'area utilizzando la formula πr². - La classe
Rectangle
calcola l'area moltiplicando larghezza e altezza.
Eredità Multilivello
L'eredità multilivello coinvolge una classe figlia che eredita da un'altra classe figlia. È come un albero genealogico con più generazioni.
Esempio di Eredità Multilivello
class Grandparent {
surname: string;
constructor(surname: string) {
this.surname = surname;
}
getSurname(): string {
return this.surname;
}
}
class Parent extends Grandparent {
firstName: string;
constructor(firstName: string, surname: string) {
super(surname);
this.firstName = firstName;
}
getFullName(): string {
return `${this.firstName} ${this.getSurname()}`;
}
}
class Child extends Parent {
middleName: string;
constructor(firstName: string, middleName: string, surname: string) {
super(firstName, surname);
this.middleName = middleName;
}
getFullName(): string {
return `${this.firstName} ${this.middleName} ${this.getSurname()}`;
}
}
let myChild = new Child("John", "Doe", "Smith");
console.log(myChild.getFullName()); // Output: John Doe Smith
Spiegazione
- Abbiamo una classe
Grandparent
con una proprietàsurname
. - La classe
Parent
estendeGrandparent
e aggiunge una proprietàfirstName
. - La classe
Child
estendeParent
e aggiunge una proprietàmiddleName
. - Ogni classe ha la sua implementazione del metodo
getFullName
.
Riepilogo dei Metodi di Eredità
Ecco una tabella che riepiloga i metodi e le parole chiave chiave che abbiamo discusso:
Metodo/Parola Chiave | Descrizione |
---|---|
extends |
Utilizzato per creare una classe come figlia di un'altra classe |
super() |
Chiama il costruttore della classe padre |
super.method() |
Chiama un metodo dalla classe padre |
Sovrascrittura del Metodo | Fornire una nuova implementazione per un metodo in una classe figlia |
Eccoci! Abbiamo coperto le basi dell'eredità in TypeScript. Ricorda, la pratica rende perfetti, quindi non esitare a sperimentare con questi concetti. Buon codice, futuri maghi di TypeScript!
Credits: Image by storyset