Pagina personale di:
Carlo Vecchio
appunti di C#, R, SQL Server, ASP.NET, algoritmi, numeri
Vai ai contenuti

C# - Classi e oggetti: definizioni

C#

Programmazione a oggetti
Oggetti e classi
   •   La programmazione a oggetti (OOP = Object-oriented programming
) è un tipo di programmazione che si contrappone alla programmazione tradizionale (dove il programma era in un certo senso 'procedurale' o 'monilitico').
   •   Con la OOP, ci possono essere molti più moduli
e ognuno di essi offre delle funzionalità specifiche. Ogni modulo è isolato ed indipendente, fatto che permette una sicura riusabilità del codice.
   •   Un oggetto
è un blocco di dati che può rappresentare qualsiasi concetto, anche astratto. È qualcosa di molto simile a un tipo struct, perché come esso ha dei membri che sono delle variabili e delle funzioni che permettono di accedere in qualche modo al contenuto delle variabili.
   •   Una classe
è il tipo dal quale sono definiti gli oggetti. Si dice che la classe "genera un oggetto" o "crea una istanza".
   •   Un'altra definizione per classe: una classe consiste di dati e di comportamento. I dati sono rappresentati dai suoi campi, il comportamento è rappresentato dai suoi metodi.
   •   La progettazione di classi e oggetti è strettamente legata alla loro documentazione; generalmente si utilizza UML (Unified Modeling Language).
   •   Per accedere ai dati di un oggetto si utilizzano le proprietà
e i campi. La differenza principale è che le proprietà non forniscono un accesso diretto ai dati, mentre i campi sì. Quindi con le proprietà è possibile implementare un controllo preventivo (per esempio imporre un range) sui dati dell'oggetto. È per questo che è meglio utilizzare proprietà piuttosto che campi. L'accesso alle proprietà di un oggetto, può essere regolato in vari modi; ogni proprietà può essere definita read/write, solo read, solo write. Sia le proprietà che i campi possono anche avere una accessibilità public o private: con la prima si intende che il membro è accessibile a tutto il codice, con la seconda si intende che il dato è accessibile alla classe stessa. Generalmente la tecnica adottata è quella di fare campi privati e fornire accesso ad essi tramite proprietà pubbliche. Si dice che i membri sono esposti dalla classe.
   •   Le funzioni esposte da un oggetto, si chiamano metodi
. Essi forniscono quindi l'accesso alle funzionalità dell'oggetto. I metodi possono essere public (visibili all'esterno) o private (visibili sono all'interno).

Rappresentazione di una classe in UML

Blocco 1
   •   Nel primo blocco è indicato il nome della classe.
Blocco 2
   •   Nel secondo blocco sono indicate le proprietà e i campi.
       - "+" o "-": indica se il membro è pubblico (segno "+") oppure privato (segno "-"). In generale non è necessario indicare i membri privati. Non c'è un simbolo per indicare quali caratteristiche read/write ha il membro.
      - Nome del membro.
      - Il simbolo ":".
      - Tipo del membro.

Blocco 3
   •   Nel terzo blocco sono indicati i metodi.
       - "+" o "-": indica se il metodo è pubblico (segno "+") oppure privato (segno "-"). In generale non è necessario indicare i metodi privati.
       - Nome del metodo.
       - I parametri del metodo (per ogni parametro è indicato in/out/inout che indica la direzione del parametro, il nome del parametro, il simbolo ":", il tipo del parametro).
       - Il simbolo ":".
       - Il tipo ritornato dal metodo.
Proprietà e metodi statici
   •   Proprietà e metodi statici sono indicati nel diagramma UML sottolineati.

Incapsulamento, Ereditarietà e Polimorfismo
Incapsulamento

   •   L’incapsulamento (o “information hiding”) è la capacità di un oggetto di nascondere la sua implementazione interna rispetto al resto del codice.
   •   In altre parole la classe è come una 'scatola nera'.
   •   Essa offre all'esterno degli attributi e delle funzioni ma nasconde all'esterno i dettagli del funzionamento.
   •   Con l’incapsulamento quindi, la gestione, la manutenzione e - sotto certi aspetti - anche la sicurezza del nostro codice sono migliori.

Ereditarietà
   •   L’ereditarietà rappresenta il meccanismo in base al quale è possibile creare nuovi oggetti a partire da oggetti già esistenti.
   •   In breve, una classe figlia, denominata classe derivata
, condivide caratteristiche e funzionamento della classe padre detta classe base.
   •   Il vantaggio fondamentale dell’ereditarietà è dato dalla possibilità di riutilizzare parecchio codice già scritto per un’altra classe.
   •   In C# una classe può essere derivata da una sola classe base (e questa può essere derivata da un'altra classe base e così via).
   •   Un membro privato della classe base, non è accessibile alla classe derivata; un membro pubblico della classe base è accessibile alla classe derivata e anche a codice esterno. Per far sì che un membro di una classe base sia accessibile solo alla classe derivata, occorre dargli una accessibilità di tipo protected
.
   •   Un membro di una classe base può essere virtual
, cioè può essere sovrascritto da una classe derivata (quindi la classe derivata ne fa una diversa implementazione).
   •   Una classe base può essere abstract
; una classe astratta non può essere istanziata direttamente ma solo tramite una classe derivata.
   •   Una classe sealed
è invece una classe che non può essere derivata.

Polimorfismo
   •   Il polimorfismo è legato all'ereditarietà delle classi.
   •   Con il polimorfismo un oggetto istanziato da una classe, "vede" anche gli attributi della classe padre (se c'è).

© 2022 Carlo Vecchio
Torna ai contenuti