• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content

Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Like this presentation? Why not share!

OOP with C#

on

  • 4,153 views

La programmazione ad oggetti in C#: incapsulamento, ereditarietà e polimorfismo con esempi di codice ed esercizi.

La programmazione ad oggetti in C#: incapsulamento, ereditarietà e polimorfismo con esempi di codice ed esercizi.

Statistics

Views

Total Views
4,153
Views on SlideShare
4,147
Embed Views
6

Actions

Likes
0
Downloads
178
Comments
0

1 Embed 6

http://www.linkedin.com 6

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    OOP with C# OOP with C# Presentation Transcript

    • www.manuelscapolan.it LEZIONE 02
    • C# è un linguaggio orientato agli oggetti 2
    • Classi • Una classe è l’astrazione di un concetto, spesso riconducibile a entità del mondo reale • La dichiarazione ne definisce i membri divisi tra caratteristiche (attributi o campi) e funzionalità (metodi) 3
    • Classi e istanze • La classe rappresenta lo “stampo” con cui vengono creati gli oggetti • Un oggetto è detto istanza di una classe dalla quale prende struttura e funzionalità • Per creare un oggetto si utilizza un costruttore della classe richiamato dalla parola chiave new 4
    • Costruttore • E’ un metodo senza valore di ritorno, con lo stesso nome della classe • E’ utilizzato per inizializzare i campi minimi che rendono valido un oggetto • Se non definito il compilatore ne crea uno senza parametri 5
    • Overloading costruttore • Possono essere definiti per una stessa classe più costruttori (in overloading) ed è possibile richiamarli tramite la parola chiave this 6
    • Scambio di messaggi • L’interazione tra le entità di un dominio avviene tramite lo scambio di messaggi (ovvero chiamate ai metodi) Nome del messaggio Destinatario del messaggio Parametri 7
    • 1 Incapsulamento Uno dei principi della programmazione ad oggetti prevede di nascondere le informazioni interne (information hiding) di una classe al fine di mantenere uno stato consistente 8
    • Proprietà • Per proteggere lo stato interno di una classe si utilizzano le proprietà: Prima di assegnare un valore posso Modificatori di eseguire una accesso validazione • In C# 3.0 possiamo inizializzarle così: Posso personalizzare il modificatore di accesso 9
    • Object initializers • In C# 3.0 gli oggetti possono essere inizializzati direttamente nella chiamata al costruttore: Non necessariamente deve essere un costruttore vuoto 10
    • Membri di classe o static • Sono condivisi da tutte le istanze di una classe, possiamo avere: – Campi statici – Costruttori statici (inizializzazione che avviene una volta sola per tutte le eventuali istanze e prima del costruttore dell’oggetto) – Metodi statici (es. String.Format) – Proprietà statiche – Classi statiche (nessun membro di istanza) 11
    • Partial Class • In C# 2.0 è possibile scrivere una classe in due file distinti e attraverso la parola chiave partial ci penserà il compilatore ad unirle in un’unica definizione (vedi designer.cs) 12
    • Partial Method • Con i metodi parziali è possibile creare nelle classi dei punti di estensione indispensabili nella code generation • I metodi parziali sono disponibili con C# 3.0 1) Non possono avere un valore di ritorno 2) Sono privati 3) Non possono avere parametri in output 13
    • 2 Ereditarietà Posso derivare nuove classi a partire da altre già definite. La classe derivata mantiene i metodi e gli attributi della classe da cui deriva (classe base). Posso aggiungere nuovi attributi e metodi e modificare il comportamento di quelli esistenti 14
    • Ereditarietà singola • In C#, contrariamente a Java, posso ereditare da una sola classe • Non utilizzate mai l’ereditarietà con l’unico scopo di riutilizzare il codice! Classe base Classi derivate 15
    • Metodi virtual e override • Se definiamo nella classe base dei metodi virtual possiamo ridefinire nelle derivate l’implementazione tramite override Richiamo l’implementazione della classe base 16
    • Metodi new • Se un metodo non è virtual non posso fare l’override, ma posso definire un metodo con la stessa firma tramite la parola chiave new 17
    • Classi abstract • Molte volte non ha senso avere una istanza della classe base se non per ottenere una delle sue derivate • Una classe base definita solo per essere derivata è una “classe astratta”, non può essere istanziata anche se può comunque contenere attributi e implementare metodi 18
    • Classi sealed • E’ possibile impedire che una classe possa essere ereditata definendola sealed • Magari per evitare che un override possa negativamente o erroneamente modificarne l’utilizzo • Contro: complica il testing (mocking) 19
    • Esercizi 1) In un namespace Library definire le entità libro e autore (Book e Author). Specificare per l’autore nome e cognome. Il libro ha le seguenti caratteristiche: titolo, ISBN, data pubblicazione, casa editrice, autore/i e numero pagine. 2) Definire per il libro una serie di costruttori per inizializzarlo a partire da: • Titolo, ISBN e data di pubblicazione • Oltre ai precedenti anche un autore o più. Nel caso di più autori che sia possibile specificarli come insieme o uno alla volta 3) Eseguire l’override di ToString() per stampare a video la copertina. Inizializzare quindi nel main del programma un insieme di libri con rispettivi autori e stampare in console le loro copertine (utilizzare la classe ArrayList) 20
    • Esercizi 4) Realizzare un extension method che consenta di sapere se un determinato libro è multi-autore 5) Aggiungere alla classe autore un metodo virtual (DescriptionToCover) che ritorna il nome completo 6) Definire una classe co-autore (CoAuthor) che deriva dalla classe autore e re-implementa il metodo virtuale mettendo come prefisso la scritta (“Forewords by “) 7) Impedire la possibilità di poter derivare dalla classe co-autore 8) Aggiungere un co-autore a un libro e verificare che venga correttamente stampato in copertina 21
    • 3 Polimorfismo L’override di un metodo virtual di una classe base nelle sue derivate permette di chiamare poi quel metodo su classi diverse senza dover conoscere a compile-time la specifica classe derivata che lo implementa 22
    • Classe base e classi derivate • Posso utilizzare le classi derivate tramite un riferimento alla classe base accedo al metodo della classe derivata tramite la classe base 23
    • Di che tipo è questa classe? as e is • Con il polimorfismo a compile-time perdiamo il tipo concreto di una classe • Per conoscere a compile-time il tipo di una classe possiamo utilizzare is e as devo fare comunque un cast per poter usare l’istanza della classe derivata … 24
    • Principio di sostituibilità di Liskov “ If for each object o1 of type S there is an object o2 of “ type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T. • Devo poter usare una classe derivata senza conoscerla … ovvero usandola per mezzo della classe base • Ottengo un minor accoppiamento fra moduli e un’ereditarietà più solida 25
    • Violazione principio di Liskov • Consideriamo l’ereditarietà tra quadrato e rettangolo … Il client conosce solo la classe base rettangolo 26
    • Applicare il polimorfismo • Vediamo come sostituire uno switch per rendere il nostro codice più flessibile, mantenibile e pulito: 27
    • Applicare il polimorfismo • Proviamo ad applicare il polimorfismo: La classe principale diventa astratta Vengono definite delle derivate Nel client la classe derivata sarà creata tramite factory o attraverso dependency injection 28
    • Interfacce • Una interfaccia è un insieme di membri astratti che una classe deve implementare per supportare un determinato comportamento definizione implementazione 29
    • Ereditarietà tra interfacce • Ereditarietà multipla si può! • Una classe può implementare più di una interfaccia e una interfaccia può ereditare da più interfacce contemporaneamente 30
    • Interfacce vs Classi abstract • Principali differenze: Classe astratta (abstract) Interfaccia Definisce membri astratti che le derivate Contiene solo membri astratti che devono devono implementare essere implementati Posso aggiungere nuovi membri non-abstract Estendere una interfaccia comporta la senza modificare le classi derivate modifica di tutte le classi che la implementano Può avere uno stato al quale si può accedere Non può avere uno stato, ma posso definire dalla derivata delle proprietà senza implementazione Posso definire tramite metodi virtuali delle I metodi non possono contenere implementazioni predefinite implementazioni Posso derivare solo da una classe astratta, Una classe può implementare più interfacce e ovvero single-inheritance una interfaccia può ereditare da più interfacce, ovvero multiple-inheritance 31
    • Composizione vs Ereditarietà • Una classe può avere come membro un’altra classe (composizione o delega) • Se la classe membro esiste esternamente alla relazione si parla di aggregazione • Segreto per vivere meglio: preferite la composizione all’ereditarietà! 32
    • Composizione vs Ereditarietà • Esempio di gerarchia di classi: Classi derivate Classe base astratta 33
    • Composizione vs Ereditarietà • Regola: incapsula ciò che varia … La classe non è più astratta e ha un nuovo membro … 34
    • Composizione vs Ereditarietà • L’interfaccia specifica ciò che varia 35
    • Come costruire le nostre classi • Obiettivo principale di un buon design è ottenere un’alta coesione e un basso accoppiamento • … e che cosa vuol dire?! – Coesione: correlazione tra le funzionalità messe a disposizione da un modulo (sia esso un insieme di metodi di una classe, un insieme di classi, una gerarchia, etc.) – Accoppiamento: (o dipendenza) si intende il grado con cui ciascun modulo fa affidamento su ciascuna delle altre componenti del programma 36
    • Esercizi 9) Riscrivere l’esempio dello switch utilizzando la composizione al posto del polimorfismo 10)Implementare nella classe libro l’interfaccia IComparable per ordinare i libri per titolo 37
    • Contacts MANUEL SCAPOLAN website: www.manuelscapolan.it twitter: manuelscapolan e-mail: info@manuelscapolan.it Credits Le immagini contenute in questa presentazione hanno licenza Creative Commons Slide 2 : http://www.flickr.com/photos/rmlowe/3281353786/ Slide 8 : http://www.flickr.com/photos/sinthonia/4439404454 Slide 14 : http://www.flickr.com/photos/pardeshi/1514977212 Slide 22 : http://www.flickr.com/photos/seelilie/4767842760 38