Scopri milioni di eBook, audiolibri e tanto altro ancora con una prova gratuita

Solo $11.99/mese al termine del periodo di prova. Cancella quando vuoi.

Fondamenti di programmazione in C# 11
Fondamenti di programmazione in C# 11
Fondamenti di programmazione in C# 11
E-book562 pagine4 ore

Fondamenti di programmazione in C# 11

Valutazione: 0 su 5 stelle

()

Leggi anteprima

Info su questo ebook

Vuoi imparare le tecniche di base per programmare in C# 11 e acquisire un livello di conoscenza sufficiente per iniziare a creare le tue applicazioni? Vuoi conoscere come funzionano .NET 7.0, il compilatore, il Garbage Collector e Visual Studio 2022? Vuoi iniziare a porre le basi per la tua nuova professione nel campo dello sviluppo di software? Oppure semplicemente devi superare degli esami universitari di informatica o di ingegneria informatica e hai bisogno di un testo di facile lettura e veramente efficace per capire la programmazione orientata agli oggetti? Questo è il libro che fa per te! Questa guida, tuttavia, è utile anche come manuale di riferimento da tenere vicino alla postazione di lavoro, per lo sviluppatore già esperto che ha bisogno di consultarlo di tanto in tanto.
LinguaItaliano
Data di uscita15 mag 2023
ISBN9791221476309
Fondamenti di programmazione in C# 11

Correlato a Fondamenti di programmazione in C# 11

Ebook correlati

Programmazione per voi

Visualizza altri

Articoli correlati

Recensioni su Fondamenti di programmazione in C# 11

Valutazione: 0 su 5 stelle
0 valutazioni

0 valutazioni0 recensioni

Cosa ne pensi?

Tocca per valutare

La recensione deve contenere almeno 10 parole

    Anteprima del libro

    Fondamenti di programmazione in C# 11 - Mario De Ghetto

    1

    1 – Primo contatto

    Prima di poter affrontare lo studio del linguaggio C# dobbiamo prendere confidenza con Visual Studio 2022: vediamo di cosa si tratta

    e come può esserci utile. Sarà anche l'occasione per vedere un primo programma in C# e capire che cos'è la OOP.

    A cosa serve Visual Studio 2022?

    Gli ambienti di sviluppo integrati (IDE) sono una categoria molto particolare di programmi applicativi: sono programmi che servono a costruire altri programmi. Tra i tanti ambienti di sviluppo esistenti, uno ha avuto forse più successo di tutti: Visual Studio, prodotto da Microsoft e ormai giunto alla versione 2022. Internamente è classificato come versione 17.

    NOTA – L'acronimo IDE significa Integrated Development Environment, cioè ambiente di sviluppo integrato. Per praticità, in questo libro useremo l'acronimo IDE al posto di ambiente di sviluppo integrato. Si utilizza comunemente anche l'acronimo VS per Visual Studio, mentre C# possiamo trovarlo anche nella forma Cs oppure Csharp.

    Visual Studio è un software che permette di utilizzare vari linguaggi di programmazione, ma anche molti strumenti utili alla gestione dell'intero ciclo di vita di qualsiasi tipo di applicazione:

    • progettazione e creazione di prototipi;

    • creazione dell’interfaccia utente, anche con i designer di interfacce grafiche e con gli emulatori di dispositivi mobili;

    • scrittura del codice con l'editor di codice;

    • gestione e interazione con le fonti di dati: progettazione, modellazione, visione/modifica;

    • gestione della documentazione;

    • test (per mezzo di unit test);

    • debug, con molti strumenti di analisi del codice e del programma in esecuzione;

    • creazione del pacchetto di installazione;

    • rilascio e distribuzione dell’applicazione.

    I principali linguaggi supportati sono quelli ormai storici di produzione Microsoft, cioè C# (che si pronuncia si sciàrp), Visual Basic, F# (che si pronuncia èf sciàrp) e C++, ma è fornito un supporto completo anche per altri linguaggi come Python, JavaScript e TypeScript.

    NOTA – In questo libro ci occuperemo esclusivamente di C#, ma potranno esserci riferimenti anche a concetti e tecniche generali applicabili a qualsiasi linguaggio utilizzabile con Visual Studio.

    PROTOTIPO : un’applicazione di prova, spesso in gran parte (volutamente) non funzionante, creata per verificare l’aderenza ai requisiti funzionali oppure per sperimentare una nuova interfaccia utente. Questa è quasi sempre un’applicazione usa e getta, necessaria solo in alcuni momenti della fase di sviluppo.

    DESIGNER : è uno strumento che permette letteralmente di progettare l'interfaccia utente, disegnando i controlli in modo visuale e quindi in modo molto veloce.

    CODICE : è il termine generico che indica l’insieme delle istruzioni espresse in un linguaggio di programmazione.

    EMULATORE : è un componente software che simula la grafica e le funzionalità di un dispositivo fisico e che quindi permette di provare una applicazione senza avere a disposizione fisicamente il dispositivo stesso. Per esempio, esistono emulatori di smartphone iPhone e Android.

    Visual Studio, come lo conosciamo ormai da circa vent'anni, permette di creare applicazioni in modo più rapido e produttivo attraverso l'uso di .NET Framework, un insieme di numerose librerie, definite in molti namespace (= spazi di nomi) e contenenti decine di migliaia di classi.

    .NET Framework può essere esteso con ulteriori librerie rilasciate dalla stessa Microsoft o da altre software house. In alternativa, anche noi possiamo creare le nostre librerie, utilizzando le classi di .NET Framework che ci servono o scrivendo le nostre classi.

    .NET CORE: in sostanza è l'evoluzione di .NET Framework riprogettato da Microsoft per fornire supporto multipiattaforma (Windows, Linux, macOS e dispositivi mobili attraverso Xamarin o integrazione con altri framework), diversi paradigmi di programmazione e migliore flusso di lavoro sul cloud. Vedremo meglio di cosa si tratta nel secondo capitolo.

    Ci sono tre edizioni principali per sviluppare applicazioni con Visual Studio, ciascuna delle quali è dedicata a una particolare tipologia di sviluppatori e con diverse licenze d'uso:

    • Visual Studio Community: è la versione gratuita per studenti, per singoli sviluppatori, oppure anche piccoli gruppi di sviluppatori (al massimo cinque e non inseriti in organizzazioni che fatturano più di un milione di dollari o che hanno più di 250 PC o utenti). La licenza non esclude un uso anche commerciale, ma vi consigliamo di verificare attentamente i dettagli della licenza d'uso dell'edizione Community per evitare un uso non consentito;

    • Visual Studio Enterprise: è l'edizione completa di tutto e ovviamente anche la più costosa. Fino ad alcune versioni precedenti di Visual Studio aveva il nome di Ultimate. Ideale per team di sviluppo anche molto corposi;

    • Visual Studio Professional: è una edizione priva solo delle funzionalità di gestione del team di sviluppo ed è adatta per uno sviluppatore individuale, ovviamente con un costo minore rispetto alla versione Enterprise.

    Visual Studio 2022 passa da 32 a 64 bit

    Fino alla versione 2019, Visual Studio era eseguito a 32 bit ma finalmente, dalla versione 2022, Visual Studio è a 64 bit. Questo comporta che il processo principale (

    devenv.exe) non è più limitato a 4 Gigabyte di memoria: se avete più di 4 Gigabyte di RAM, quindi, potete caricare soluzioni piene di progetti, a loro volta pieni di file, e tutto questo a una velocità enormemente maggiore rispetto alle versioni precedenti. Se volete vedere un esempio della velocità di caricamento di 1.601 progetti, contenenti quasi 300.000 file, date un'occhiata alla GIF

    https://bit.ly/GIFVS2022, pubblicata nel blog del team di sviluppo di Visual Studio.

    Linguaggi supportati

    Come abbiamo già affermato, i linguaggi forniti in Visual Studio, direttamente sviluppati da Microsoft o solo supportati, sono molti: oltre ai tradizionali C#, Visual Basic, F# e C++, infatti, ci sono TypeScript, JavaScript, Python e altri ancora. La discussione su quale linguaggio sia il migliore è tradizionalmente ancora viva tra gli sviluppatori C# e quelli Visual Basic. Fino alla versione 2010 la scelta tra i linguaggi VB e C# era dettata quasi unicamente dalle preferenze personali e dall'ampiezza delle conoscenze dello sviluppatore: infatti i due linguaggi avevano le stesse potenzialità, perché entrambi basati sulla programmazione orientata agli oggetti (OOP) e sulle librerie di .NET Framework, mentre ovviamente differiscono nella sintassi, cioè la grammatica e la grafia con cui vengono scritte le istruzioni.

    Nelle versioni più recenti la parità delle funzionalità dei due linguaggi si è persa, perché C# ha continuato a crescere, con l'introduzione di nuove funzionalità, molto spesso importate dal paradigma funzionale, di cui il linguaggio F# è l'espressione più completa. Visual Basic, invece, è rimasto indietro, salvo pochi aggiustamenti che sono serviti per correggere alcuni errori. Il team di sviluppo Microsoft ha motivato il blocco dello sviluppo di Visual Basic con la necessità di dare stabilità al linguaggio.

    NOTA – La nostra opinione è che portare ancora avanti il linguaggio Visual Basic è ormai economicamente insostenibile per Microsoft, dato che commercialmente si tratta di un doppione di C#: C# fa le stesse cose di VB e, anzi, ne fa di più. Ciò non toglie che Visual Basic resterà nel mondo reale ancora per decenni come è successo per VB 6.0, dato che esistono ormai decine o centinaia di migliaia di applicazioni scritte in VB.NET. La conversione a C# prima o poi avverrà, ma molto gradualmente e solo quando sarà necessario estendere il campo delle applicazioni ad altre piattaforme o a nuove funzionalità che non sono disponibili in Visual Basic.

    Il linguaggio C# ha avuto varie estensioni che permettono di utilizzarlo anche in applicazioni crossplatform (multipiattaforma): Windows, iOS e Android per i dispositivi mobili e Windows e Linux per l'ambito desktop. Questo linguaggio, quindi, è il candidato ideale per sfruttare al meglio il nuovo framework .NET Core.

    Il target del linguaggio C++, invece, è molto differente da quello dei due linguaggi citati in precedenza. Infatti, C++ è più orientato alla progettazione di programmi di più basso livello (più vicini alla macchina): sistemi operativi, compilatori, driver, ma anche utilità in codice nativo, cioè eseguibili direttamente dal processore, senza il supporto di .NET Framework (C++ unmanaged). Per la precisione, comunque, anche C++ è un linguaggio che permette la programmazione orientata agli oggetti.

    Il supporto al linguaggio C++ è necessario a Visual Studio per poter scrivere e compilare programmi da caricare come firmware a microcontroller come Arduino.

    MANAGED/UNMANAGED: i termini managed e unmanaged si riferiscono rispettivamente al codice gestito e al codice non gestito nell'ambito di .NET Framework o di .NET Core. C# e C++ possono compilare sia codice gestito, sia codice non gestito.

    F#, invece, è un linguaggio che permette di programmare con il paradigma funzionale di derivazione matematica e scientifica, ma utilizzabile con profitto anche nelle nostre applicazioni.

    È un linguaggio interessante perché molto conciso, quasi matematico, utilizzabile efficacemente all'interno di librerie di funzioni che possono essere poi richiamate dalle applicazioni C#.

    Paradigmi di programmazione

    I paradigmi di programmazione sono gli stili fondamentali di programmazione, intesi come un insieme di strumenti concettuali a disposizione del programmatore in uno specifico linguaggio di programmazione. Un programmatore può scrivere un programma utilizzando degli elementi di programma (per esempio variabili, oggetti, funzioni) e dei procedimenti ben precisi per eseguire delle elaborazioni sui dati (cicli, assegnazioni, calcoli ecc.). Esistono numerosi paradigmi di programmazione, perché molte buone pratiche stimolano la creazione di nuovi linguaggi e di nuovi paradigmi che, di volta in volta, offrono nuove potenzialità e spesso un incremento di produttività degli sviluppatori. I paradigmi adottati sino a oggi, alcuni più noti, altri meno, sono i seguenti:

    • programmazione imperativa;

    • programmazione dichiarativa;

    • programmazione modulare;

    • programmazione orientata agli aspetti;

    • programmazione orientata agli utenti;

    • programmazione orientata agli oggetti (OOP);

    • programmazione strutturata secondo patterns;

    • programmazione per pattern matching;

    • programmazione procedurale;

    • programmazione strutturata;

    • programmazione per tipi di dati astratti;

    • programmazione concorrente;

    • programmazione logica;

    • programmazione funzionale;

    • programmazione orientata agli eventi;

    • programmazione a vincoli.

    Alcuni linguaggi, come C#, aderiscono a più di un paradigma di programmazione. Se prendiamo qualsiasi programma C#, scopriremo che aderisce all’importantissimo paradigma della

    programmazione orientata agli oggetti, perché in C# tutto è un oggetto, perfino l’utente. In C# troviamo anche il paradigma della programmazione orientata agli eventi, in particolare per la definizione dei comportamenti delle interfacce grafiche, e possiamo utilizzare anche le tecniche della programmazione strutturata.

    Naturalmente possiamo facilmente individuare anche i paradigmi della programmazione imperativa (le istruzioni sono comandi), della programmazione dichiarativa (per esempio nell'ambito delle interfacce grafiche definite nelle applicazioni WPF, con il codice XAML) e della programmazione funzionale (istruzioni della libreria LINQ e altre tecniche funzionali spesso derivate da F#).

    Avrete ormai capito che il mondo non è solo bianco o nero, poiché vi si possono trovare mille colori e sfumature. Allo stesso modo, in C# si può programmare con vari paradigmi di programmazione, anche se il paradigma fondamentale utilizzato ovunque è quello della programmazione orientata agli oggetti.

    Prima di proseguire, analizziamo alcuni dei più importanti paradigmi di programmazione utilizzati in un'applicazione Visual Studio con il linguaggio C#.

    Programmazione imperativa e dichiarativa

    Quasi tutti i linguaggi di programmazione aderiscono al paradigma di programmazione imperativa. Il termine imperativa chiarisce già in parte il fatto che ogni istruzione impartita al computer, attraverso un programma, è sostanzialmente un ordine per il computer.

    La programmazione imperativa si contrappone alla programmazione dichiarativa, dove non vengono impartiti ordini ma vengono fatte delle affermazioni che la macchina è implicitamente tenuta a considerare o a rendere vere.

    Esempi di programmazione dichiarativa sono tutti i linguaggi descrittivi, detti linguaggi di markup: per esempio HTML e XAML non ordinano nulla al computer, ma piuttosto descrivono, rispettivamente, come deve essere la pagina web o l’interfaccia grafica dell’applicazione.

    XAML è il linguaggio scelto per descrivere le interfacce grafiche delle applicazioni WPF (Windows Presentation Foundation), ma che poi è stato adottato anche dalle applicazioni UWP e Xamarin.

    Programmazione orientata agli eventi

    La programmazione orientata agli eventi è un particolare tipo di programmazione in cui il flusso del programma non segue un percorso sequenziale prestabilito dal programmatore, salvo che nei punti dove si effettua una ramificazione del percorso, a seguito di una scelta. Il flusso logico della programmazione a eventi è determinato, in gran parte, dal verificarsi di particolari eventi che influiscono sull’esecuzione del programma.

    Quali sono questi eventi? Potremmo innanzi tutto classificare gli eventi in due principali categorie: gli eventi di sistema e gli eventi dell’utente:

    • gli eventi di sistema sono tutti gli eventi generati dal sistema operativo o dall’hardware e rilevati dal sistema operativo: uno degli esempi più evidenti è il timer, poiché gli impulsi del timer scattano a intervalli regolari, in modo indipendente dall’utente. Un altro esempio è un errore per un tentativo di stampare su un dispositivo spento;

    • gli eventi dell’utente sono costituiti da tutti quegli eventi generati da un’azione dell’utente: uno spostamento del mouse, un clic su un pulsante, la pressione di un tasto della tastiera e molto altro.

    La gestione di un evento viene realizzata attraverso, appunto, un gestore dell'evento (event handler). Ciascun gestore di evento è associato al corrispondente evento e, al verificarsi di quest’ultimo, scatta l’esecuzione di una serie di istruzioni. Inoltre, un evento può innescare a sua volta una serie di altri eventi a cascata, ciascuno dei quali viene processato dal corrispondente gestore di evento, e così via, finché tutta la coda degli eventi non si è esaurita.

    La programmazione a eventi è in genere utilizzata nell’ambito delle interfacce grafiche e non è quindi un caso che abbia visto la luce con i linguaggi visuali, come Visual Basic e C#.

    Programmazione funzionale

    La programmazione funzionale è un paradigma che prevede un flusso di programmazione costituito completamente da una serie di funzioni matematiche da valutare o da funzioni di manipolazione di insiemi di elementi (l'insiemistica, come è noto, rientra nell'ambito della matematica).

    I vantaggi principali di questo tipo di programmazione sono costituiti dall’assenza di effetti collaterali e quindi da una più semplice manutenzione dei programmi, da un’assenza di errori e da una maggiore ottimizzazione.

    La troviamo soprattutto in ambito accademico e in ambito industriale, anche se negli ultimi tempi si sta affacciando sempre di più anche in ambiti applicativi più commerciali: per esempio in applicazioni bancarie, assicurative e statistiche in generale.

    Come abbiamo già detto, un linguaggio .NET che aderisce al paradigma della programmazione funzionale è F#. Altri linguaggi molto noti che aderiscono alla programmazione funzionale sono

    LISP e LOGO, ma anche Ruby, Python e Perl possono utilizzare uno stile funzionale.

    In C# possiamo trovare alcuni elementi di programmazione funzionale: per esempio quando utilizziamo le istruzioni LINQ o altri costrutti che sono stati introdotti sulla scia di F#.

    LINQ: è una libreria introdotta con Visual Studio 2005 e con .NET Framework 3.5, per manipolare e interrogare insiemi di oggetti o di elementi di vario genere.

    Programmazione orientata agli oggetti (OOP)

    Ecco finalmente che arriviamo al paradigma della programmazione orientata agli oggetti. Abbiamo già accennato che per i linguaggi gestiti dal Framework .NET tutto è un oggetto: il computer, i dati, il database, l’utente, i file, i flussi in lettura o scrittura di un file o di un video.

    In questo libro vi spiegheremo: che cosa sono gli oggetti, come si creano, come si gestiscono, come si utilizzano, come si distruggono e molte altre cose.

    Il paradigma della programmazione orientata agli oggetti parte da un presupposto ben preciso: l’applicazione non sarà nient’altro che una rappresentazione di una parte della realtà che ci circonda e, in particolare, di quella parte che ci interessa gestire nell’applicazione stessa. Questa realtà di interesse conterrà alcuni oggetti, con le loro caratteristiche e con il loro comportamento:

    • per caratteristiche intendiamo le proprietà (dette anche attributi) di un certo oggetto. Per esempio, per un’automobile, le proprietà sono il colore della carrozzeria, il numero di persone trasportabili, la cilindrata del motore, il tipo di alimentazione (ibrida, solo elettrica, gas, benzina verde, gasolio…), la marca, il modello, il numero di telaio, l’attuale posizione della frizione (per esempio in folle), lo stato attuale del motore (acceso, spento), lo stato delle frecce di direzione (spente, accese a destra, accese a sinistra, tutte accese) ecc.;

    • per comportamento intendiamo le azioni che un oggetto può eseguire. Per esempio, la stessa automobile avrà la possibilità di compiere varie azioni: avviare il motore, spegnere il motore, innestare la marcia, frenare, accendere le luci, ruotare il volante a destra e così via. Le azioni sono espresse attraverso i metodi, cioè delle routine contenenti varie istruzioni.

    Riepilogando, un oggetto ha un proprio stato (i dati) e un proprio comportamento (i metodi).

    Inoltre, lo stato di un oggetto può cambiare nel tempo: il motore può essere spento e poco dopo essere acceso perché è stata eseguita l’azione di accensione del motore. Le azioni, quindi, possono cambiare lo stato di un oggetto.

    Lo stato dell’oggetto può determinare non soltanto la rappresentazione attuale dell’oggetto, ma può anche condizionare l’esecuzione o meno di alcune azioni. Per esempio, non si può accendere un motore già acceso e non si può spegnere un motore spento. Lo stato, quindi, è la si tuazione istantanea dell’oggetto che può cambiare nel tempo.

    Un altro aspetto importante della programmazione orientata agli oggetti è il fatto che più oggetti possono avere lo stesso tipo di attributi e di comportamenti. Tali oggetti, cioè, appartengono alla stessa classe di oggetti.

    La classificazione di vari oggetti è un esercizio che abbiamo già fatto in passato, a scuola. Per esempio, provate a classificare i seguenti oggetti nelle classi viventi e non viventi: mucca, gatto, ferro, girasole, insalata, acqua, sale. Non è difficile, vero? Infatti, siamo stati abituati fin da piccoli a classificare gli oggetti e a riconoscere a quale classe appartiene un oggetto qualunque. È diventata come una dote naturale, quasi istintiva.

    Facciamo un passo avanti: parlare di classe o di tipo è la stessa cosa. Anche nel linguaggio comune possiamo dire che il gatto fa parte della classe degli animali (o più propriamente della classe dei felini), oppure possiamo dire che il gatto è un tipo di animale (o un tipo di felino) o, ancora, che quell'animale è un tipo di gatto. Nella programmazione orientata agli oggetti si può parlare allo stesso modo di classe o di tipo, a seconda del contesto in cui ci si trova.

    I concetti fondamentali della programmazione orientata agli oggetti

    La programmazione orientata agli oggetti, spesso identificata con l'acronimo OOP che significa

    Object Oriented Programming, è così importante in C# e negli altri linguaggi .NET che dobbiamo iniziare subito a conoscere i tre concetti fondamentali che costituiscono i pilastri su cui si basa questo paradigma: ereditarietà, incapsulamento e polimorfismo.

    È programmazione orientata agli oggetti vera e propria se sono applicati tutti e tre questi concetti, altrimenti si tratta tutt'al più di programmazione basata sugli oggetti.

    Trattandosi di un argomento molto importante, li analizziamo brevemente uno ad uno. Nel corso del libro avremo modo di trattarli nuovamente, ma in modo molto più approfondito.

    Ereditarietà

    Per capire il concetto di ereditarietà, immaginiamo di avere una classe generica che rappresenta, per esempio, la classificazione del regno animale.

    RegnoAnimale

    Poriferi

    Spugne

    Anellidi

    VermiSegmentati

    Lombrico

    Sanguisuga

    Platelminti

    VermiPiatti

    Tenia (verme solitario)

    Artropodi

    Celenterati

    Nematodi

    Echinodermi

    Molluschi

    Cordati

    Pesci

    Anfibi

    Rettili

    Mammiferi

    Felini

    Gatto

    Tigre

    Leone

    Ghepardo

    Canidi

    Uomo

    Uccelli

    NOTA – Abbiamo rappresentato solo una parte della classificazione per motivi di spazio, ma è quanto basta per i nostri scopi. Non seguiremo la suddivisione tassonomica attualmente utilizzata nell'ambito delle scienze naturali (vita, dominio, regno, phylum, classe, ordine, genere e specie), ma useremo a ogni livello il solo termine che ci interessa nell'ambito della programmazione orientata agli oggetti: classe.

    Nella OOP, una classe può essere derivata da un'altra classe ed ereditare così tutte le caratteristiche base, eventualmente aggiungendo alcune caratteristiche più specializzate.

    Nel nostro esempio, il RegnoAnimale si suddivide in vari rami, tra cui i Cordati (animali dotati di spina dorsale) che a loro volta si suddividono in altre classi tra cui i Mammiferi, a loro volte suddivisi in altre classi tra cui l'Uomo.

    Da questa organizzazione in classi riusciamo a intuire che la classe Gatto deriva dalla classe

    Felini che, a sua volta, deriva da Mammiferi. Risalendo ancora di livello, le classi citate derivano dalla classe generica Cordati.

    Per denominare le classi derivate si può usare una notazione con il punto (.), specificando tutto il loro percorso, come nel seguente esempio:

    RegnoAnimale.Cordati.Mammiferi.Felini.Gatto

    Questo è il nome completo della classe Gatto e va utilizzato, tutto o in parte, quando da qualche altra parte esiste un'altra classe Gatto, anche se ha un significato diverso. Come vedremo, si può utilizzare anche solo una parte del nome completo della classe, abbreviandolo. In questo modo si rende il codice più conciso e leggibile.

    NOTA – Abbiamo introdotto la notazione del punto (.). Il punto tra due elementi (due classi o una classe e il suo metodo o attributo) significa semplicemente che l'elemento posto a destra del punto appartiene all'elemento posto a sinistra.

    La stessa cosa si può fare quando ci si deve riferire a un metodo o a una proprietà di una classe.

    Per esempio, per indicare il colore di un gatto possiamo riferirci alla corrispondente proprietà:

    Gatto.Colore = Nero;

    Se volessimo cambiare il colore a un gatto, potremmo utilizzare il metodo specifico:

    Gatto.CambiaColore(Bianco);

    METODO: unità di codice espressa nella forma di subroutine o di funzione. Questa unità di codice definisce le azioni (il comportamento) degli oggetti della stessa classe.

    PROPRIETÀ: una informazione elementare che caratterizza lo stato di un singolo individuo appartenente alla classe che lo definisce.

    NOTA – Vedete che le istruzioni riportate qui sopra hanno un punto e virgola (;) alla fine? In C# bisogna sempre mettere un punto e virgola alla fine di una istruzione, altrimenti sarà segnalato un errore del compilatore e anche di IntelliSense (vi diremo più avanti di cosa si tratta…)

    Il concetto di classe derivata possiamo spiegarlo anche in un altro modo: le classi che si trovano in un livello più alto della gerarchia sono classi più generiche, mentre man mano che scendiamo nella gerarchia troviamo classi di livelli inferiori che sono classi sempre più specializzate, dato che aggiungono ulteriori specificazioni. Tali specificazioni sono costituite da un certo numero di attributi e/o da un certo numero di metodi.

    Incapsulamento

    Un altro principio importante della programmazione orientata agli oggetti è l'incapsulamento. Il termine aiuta già in parte a capire il concetto a cui si riferisce: non tutti gli attributi vengono esposti all'esterno per essere visibili anche dalle altre classi. Anzi, la maggior parte degli attributi rimane (e deve rimanere) nascosta all'interno della classe e chi la osserva dall'esterno non sa nemmeno che questi attributi esistono.

    Una opinione diffusa, tanto da essere considerata una delle best practice (= migliori pratiche) della programmazione orientata agli oggetti, è quella che prevede che nessun attributo sia visibile direttamente dall'esterno. In questo modo non potremo accedere direttamente a tali attributi ma potremo leggere o manipolare solamente gli attributi per i quali siano stati definiti appropriati metodi di lettura e/o scrittura.

    L'incapsulamento rende una classe molto simile a una scatola nera: l'interazione con la scatola nera (classe) è limitata ai metodi che possono essere richiamati. Non è possibile in alcun modo modificare lo stato interno della scatola nera se non in modo fortemente controllato attraverso i metodi.

    In questo scenario c'è un vantaggio collaterale: se dall'esterno non è possibile vedere alcuna modifica dei punti di accesso (metodi) alla scatola nera, possiamo modificare anche pesantemente il codice interno alla classe senza dover cambiare anche di una sola riga di codice in tutto il resto dell'applicazione. Tecnicamente, in questo caso si parla di alto grado di isolamento tra l'interno e l'esterno della classe.

    Polimorfismo

    Cos'è il polimorfismo? Prima di tutto vediamo qual è il significato della parola: deriva dal greco, dalla composizione di due parole, cioè poli = molte e morfo = forma, quindi rappresenta la possibilità di avere molte forme diverse in base al contesto. Per polimorfismo si intende la possibilità di interagire con due o più classi, dotate di un insieme di metodi e di proprietà comuni, senza dover identificare esattamente il tipo di oggetto con il quale si sta lavorando.

    Per esempio, potremmo realizzare una collezione di oggetti di tipo Animali in grado di accogliere uno o più riferimenti a oggetti di tipo Cane, Gatto e Canarino. Ognuna delle classi specializzate Cane, Gatto e Canarino avrà anche dei metodi e degli attributi specializzati che caratterizzano la particolare classe. Per esempio, il Gatto miagola, ma il Cane

    Ti è piaciuta l'anteprima?
    Pagina 1 di 1