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.