73 TS – Visibilità e metodi public, protected, private
In questa lezione vedremo le proprietà e le visibilità e i metodi delle classi.
class Lesson { type: string lenght: number title: string description?: string }
Questa è una classe con delle proprietà il cui tipo è ben definito (description è una proprietà facoltativa).
Aggiungiamo un costruttore per inizializzare il futuro oggetto
class Lesson { type: string lenght: number title: string description?: string constructor(type: string, lenght: number, title: string, description?: string ) { this.type: string; this.lenght: number; thistitle: string; this.description?: string; } }
creiamo l’oggetto lesson
let lesson = new Lesson('Corso', 4, 'Intro', '');
se io voglio cambiare la proprietà descrizione
lesson.description = 'Questa è la mia descrizione' console.log(lesson.description);
a video verrà stampata la descrizione modificata, questo perché di default ogni proprietà creata in una classe sono di tipo public è come se scrivessi così
class Lesson { public type: string public lenght: number public title: string public description?: string
Infatti posso tranquillamente accedere e modificare ogni proprietà della classe.
Se invece noi modifichiamo la proprietà description in protected, il programma genererà un errore appena cerco di modificarne il valore
class Lesson { type: string lenght: number title: string protected description?: string constructor(type: string, lenght: number, title: string, description?: string ) { this.type: string; this.lenght: number; thistitle: string; this.description?: string; } } let lesson = new Lesson('Corso', 4, 'Intro', ''); lesson.description = 'Questa è la mia descrizione' console.log(lesson.description);
Questo perché quando ho una proprietà protected, non posso lavorare con quella proprietà dall’oggetto, ma solo all’interno, come dal suo costruttore col this.
Oppure è possibile accedervi tramite un metodo di un altra classe che estende quella genitore
class IntroLesson extends Lesson { setDescription(desc: string) { this.description = desc; } }
Ma i setter e i getter li vedremo più avanti.
Se invece mettiamo la proprietà come private, potrò accedervi solo all’interna di quella classe e non sarà visibile nemmeno dalle classi figlie.
In generale bisogna impostare le visibilità in base alle esigenze, se si vuole che gli oggetti creati abbiano la possibilità di modificare direttamente le proprietà della classe, allora è da usare public.
Se vogliamo che la proprietà si visibile nella classe in cui viene creata e dalle classi che la estendono, allora utilizzare protected.
Se vogliamo che la proprietà venga solamente vista nella sua classe allora usare private. Un classico esempio di private è un contatore che viene incrementato ogni volta che la classe viene richiamata, non c’è bisogno di far modificare il contatore dalle classi discendenti.
class Lesson { type: string lenght: number title: string protected description?: string private instances: number = 0 constructor(type: string, lenght: number, title: string, description?: string ) { this.type: string; this.lenght: number; thistitle: string; this.description?: string; this.instances++ } }
Solo il costruttore potrà modificare la proprietà instances, nemmeno la classesse figli IntroLesson.
A questo punto posso creare un metodo pubblico che restituisce il valore di instances
class Lesson { type: string lenght: number title: string protected description?: string private instances: number = 0 constructor(type: string, lenght: number, title: string, description?: string ) { this.type: string; this.lenght: number; thistitle: string; this.description?: string; this.instances++ } getInstances() { return this.instanes; } }
Ora posso richiamare il metodo dall’esterno
console.log(getInstances())
Questo è solo un esempio e il contatore non è reale, ma l’obiettivo è quello di far capire il grado di visibilità.
Riassunto
Tutte le proprietà e anche metodi creati in una classe sono di predefinito public.
Se voglio che solo la classe e le classi discendenti possano modificare metodi e proprietà devo settari su private.
Se invece metodi e proprietà devono essere visibili soltatanto all’interno della classe in cui sono stati creati, allora dovranno essere dettati su protected.
Questa metodologia di visibilità di proprietà e metodi è tipica di moltissimi altri linguaggi di programmazione, assente in JavaScript, ma da oggi sfruttabile grazie a TypeScript.