In un precedente post del blog, abbiamo introdotto un concetto molto importante nella programmazione orientata agli oggetti: Le classi. Ora analizzeremo un altro concetto fondamentale: L’ereditarietà, il meccanismo che consente a una classe di acquisire il comportamento di un’altra classe.
Ricordate l’esempio del post precedente con la classe “Persona”? Immaginiamo una scuola e vogliamo gestire studenti e insegnanti. Entrambi sono persone, ma con caratteristiche diverse. Creiamo quindi una classe “Insegnante” e una classe “Studente”, ed entrambe le classi ereditano le caratteristiche dalla classe “Persona”.
Come si eredita una classe da un’altra?
Una nuova Class extends è ora disponibile per facilitare l’ereditarietà. Utilizzando il nostro esempio scolastico, creiamo una classe “Studente” che eredita la classe “Persona”.
Class Extends Person
E il costruttore?
Allora per il costruttore (se non è stato definito un costruttore specifico per la classe “Studente”), viene automaticamente richiamato il costruttore della classe “Persona”.
È anche possibile sovrascrivere un costruttore. Ad esempio, nel caso di “Studente”: uno studente ha nome, cognome e data di nascita come una persona, ma ha anche un voto e una scuola. In questo caso, si può usare il comando new Super che consente di richiamare il costruttore della classe padre. Poi, nel costruttore di “Studente”, si può aggiungere il codice specifico per il grado e la scuola.
Class constructor
.
C_TEXT( ) ( ) ( ) ( ) ( ) ( ; ; ) $1 // FirstName
C_TEXT$2 // LastName
C_DATE$3 // Birthdate
C_TEXT$4 // SchoolName
C_TEXT$5 // Grade
Super$1$2$3 // Call the "Person" constructor
ThisSchoolName:= $4
This . :=Grade$5
E le funzioni?
È possibile aggiungere funzioni specifiche della classe “Studente”, dalle quali è possibile richiamare una funzione della classe padre (“Persona”).
Nell’esempio seguente, abbiamo una funzione che restituisce una stringa contenente il nome, il voto e la scuola dello studente. Nella classe “Persona” esiste già una funzione che restituisce il nome completo di una persona. Chiamiamo quindi questa funzione, getFullName, e aggiungiamo le informazioni specifiche di uno studente.
Function getIdentity
C_TEXT( ) := . ()+", "+ . +" voto in "+ .$0
$0SupergetFullNameThisGradeThisSchoolName
In un metodo, istanziamo un’istanza della classe “Studente”. Richiamiamo la funzione getFullName dalla classe padre, “Persona”. Poi, chiamiamo la funzione getIdentity dalla classe “Studente”. Come si può notare, non ci sono differenze tra le funzioni getFullName e getIdentity.
C_OBJECT($s)
$s :=cs.Student.new("Joe"; "Doe";!2002-02-20!; "Waco High School"; "10th")
$name :=$s.getFullName() //return John Doe
$identity :=$s.getIdentity(
) //return Joe DOE, 10th grade in Waco High School