Programmazione orientata agli oggetti in 4D: Gestire l’ereditarietà delle classi

Tradotto automaticamente da Deepl

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.

Esempio di database

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
This
.SchoolName:= $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

Una dimostrazione dal vivo per riassumere

Vanessa Talbot
- Product Owner - Vanessa Talbot è entrata a far parte del team di 4D Program nel giugno 2014. In qualità di Product Owner, è incaricata di scrivere le storie degli utenti e di tradurle in specifiche funzionali. Il suo ruolo è anche quello di assicurarsi che l'implementazione della funzionalità fornita soddisfi le esigenze del cliente. Ha lavorato sulla maggior parte delle nuove funzionalità di multi-threading preemptive e anche su un argomento molto complesso: la nuova architettura per le applicazioni con motore. Vanessa si è laureata presso Telecom Saint-Etienne. Ha iniziato la sua carriera presso il Criminal Research Institute come sviluppatrice per il dipartimento audiovisivo. Ha lavorato anche nei settori dei media e della medicina come esperta di supporto tecnico, produzione e documentazione di nuove funzionalità.