Sei sulla pagina 1di 28

C#

Caratteristiche Linguaggio OO

Incapsulamento:
i dati che definiscono lo stato interno di un
oggetto sono accessibili solo ai metodi
dell'oggetto stesso.
Per alterare lo stato interno dell'oggetto,
necessario invocarne i metodi.
L'oggetto come unablack-box, cio una
scatola nera di cui attraverso l'interfaccia
notocosa fa, ma noncome lo fa.
Information hiding, gestione della visibilit
di quello che accade dentro la scatola

C#

Caratteristiche Linguaggio OO (2)

Ereditariet:
Permette di derivare nuove classi
a partire da quelle gi definite.
Una classe derivata,
sottoclasse, mantiene i metodi e gli attributi delle classi
da cui deriva (classi base, o superclassi)
La sottoclasse pu definire i propri metodi o attributi e
pu ridefinire i metodi ereditati (overriding)
Quando una classe eredita da una sola superclasse si
parla di eredit singola; viceversa, si parla di eredit
multipla.
Meccanismo per ottenere l'estensibilit e il riuso del
codice

C#

Caratteristiche Linguaggio OO (3)

Polimorfismo:
Le istanze di una sottoclasse possono
essere utilizzate al posto di istanze della
superclasse
I metodi che vengono ridefiniti in una
sottoclasse sono detti polimorfi, in
quanto lo stesso metodo si comporta
diversamente a seconda del tipo di
oggetto su cui invocato.

C#

Altre keyword

Interfaccia:
Tipi e operazioni definiti in un componente che
sono visibili fuori del componente stesso.

Specifica:
Funzionamento del componente, espresso
mediante propriet osservabili attraverso
l'interfaccia.

Implementazione:
Strutture dati e funzioni definiti dentro al
componente, non necessariamente visibili da
fuori.

C#

Pensare ad oggetti

In unprogramma di tipo procedurale, si soliti


iniziare a ragionare in maniera top-down,
partendo cio dal main e creando mano a
mano tutte le procedure necessarie.
Pensare ad oggetti vuole dire identificare gli
oggetti che entrano in gioco nel programma
che vogliamo sviluppare e saperne gestire
l'interazione degli uni con gli altri.
Nella programmazione ad oggetti serve
definire prima le classi e poi associare ad esse
le propriet ed i metodi opportuni.

C#

Come si scelgono gli oggetti?

Cosa si vuole che sia in grado di fare?


Un oggetto che abbia uno o due soli metodi deve fare
riflettere
Oggetti senza o con troppi metodi sono, in genere, da
evitare

Quali propriet sono necessarie affinch l'oggetto


sia in grado di eseguire le proprie azioni?
Attributi, propriet che descrivono le caratteristiche
peculiari di un oggetto(peso, altezza, )
Componenti, propriet che sono atte a svolgere delle
azioni(testa, mani, piedi, )
Peer objects, propriet che a loro volta sono identificate
e definite in altri oggetti (auto di una persona,)

C#

Accoppiamento & Coesione

Accoppiamento: quanto sono legate


(dipendenze reciproche) due unit separate di
un programma.
Coesione: quantit e eterogeneit dei task di
cui una singola unit (una classe o un metodo)
responsabile. Se una classe ha una
responsabilit ristretta ad un solo compito il
valore della coesione elevato.

Obiettivo: alta coesione e basso


accoppiamento

C#

Creare una classe

class N om eClasse
{
//Proprit
visibilit tipo nom eProrpiet;
//Costruttore
public N om eClasse() { }
//M etodi
visibilit tipoRitornato nom eM etodo1() { }
}

C#

Modificatori di accesso

public

Nessuna restrizione di accesso.

protected

L'accesso limitato alla classe di


appartenenza o ai tipi derivati dalla
classe di appartenenza.

internal

L'accesso limitato all'assembly


corrente.

protectedint L'accesso limitato all'assembly


ernal
corrente o ai tipi derivati dalla classe di
appartenenza.
private

L'accesso limitato al tipo di


appartenenza.

C#

10

Campi e Propriet

Le propriet consentono a una classe di esporre un modo


pubblico per ottenere e impostare valori, nascondendo
tuttavia il codice di implementazione o di verifica.
Campo

private string em ail;


public string Em ail
{
Propriet

get { return em ail; }

Parola chiave usata alla fine


di metodi che restituiscono
un valore
Parola chiave, si riferisce al
valore passato che
vogliamo assegnare

set { em ail= value; }


}
Abilito la letture, get, e la scrittura della

C#

11

Metodi

Azioni che permettono di interagire con gli


oggetti
Tipo restituito
Creo una stringa vuota

public string ChiSei() {


string result = "";
result = "Io sono " + nom e + " " + cognom e + "/n";
result = result + "La m ia em ail " + em ail;
return result;
}
Il simbolo + viene usato per
concatenare, cio unire, le
stringhe
Alla stringa iniziale concateno
altre parti
Valore restituito dalla funzione

C#

Costruttori

12

Servono per creare listanza della classe, cio


loggetto usato durante lesecuzione del programma
private string N om e;
private string Cognom e;
public Persona(string N om e, string C ognom e) {
this.N om e = N om e;
this.Cognom e = C ognom e;
}
La keyword this permette di risolvere i problemi di nomi

C#

Overload

13

Metodo con stesso nome, ma con parametri diversi o con


valore di ritorno diverso
public Persona(string N om e, string Cognom e, ) {
this.N om e = N om e;
this.Cognom e = Cognom e;
}
public Persona(string nom e, string cognom e, string em ail)
{
this.nom e = nom e;
this.cognom e = cognom e;
this.em ail= em ail;
}

C#

14

Utilizzo dei metodi

static void M ain(string[] args)


{
Persona m ario = new Persona("M ario", "Verdi");

La keyword new, serve per creare


nuovi oggetti. Si usa prima del
costruttore
m ario.Em ail= "m ario@ polim i.it";

Le propriet si utilizzano semplicemente con =


senza le ()
string rit = m ario.C hiSei();
Console.W rite(rit);
Console.ReadKey();
}

Classica chiamata di
un metodo con
valore di ritorno

C#

15

Ereditariet

Permette di estendere classi gi esistenti con nuove funzionalit, senza


dover riscrivere tutto il codice
class Studente : Persona
{

Nuova
classe

Classe da cui
eredita

La classe Studente(S) effettivamente sia Studente che Persona(P).


possibile utilizzare un'operazione di cast per convertire S in un
oggetto P. L'operazione di cast non implica la modifica
dell'oggetto S, ma limita semplicemente la visualizzazione
dell'oggetto S ai dati e ai comportamenti dell'oggetto P
Dopo aver eseguito il cast di un oggetto S in un oggetto P, possibile
eseguire il cast dell'oggetto P per convertirlo di nuovo in S.
Non possibile fare il cast da P a S se loggetto non un istanza di S.

C#

Richiamo costruttore base

16

private int m atricola;


public Studente(string nom e, string cognom e,
int m atricola) : base(nom e, cognom e) {
this.m atricola = m atricola;
}

La keyword base che richiama i metodi della classe base, in


questo caso direttamente il costruttore, e gli passa i parametri

Dopo lesecuzione del costruttore della classe base, vengono


eseguite le operazioni rimanenti.

C#

Richiamo costruttore base(2)

17

private int m atricola;


public Studente(string nom e, string cognom e,
int m atricola) : base(nom e, cognom e) {
this.m atricola = m atricola;
}

La keyword base che richiama i metodi della classe base, in


questo caso direttamente il costruttore, e gli passa i parametri

Dopo lesecuzione del costruttore della classe base, vengono


eseguite le operazioni rimanenti.

public Studente(string nom e, string cognom e) :


this(nom e, cognom e, 00000) { }

In questo caso il costruttore richiama il costruttore definito prima


settando un valore di default per la matricola

C#

Override

18

Sostituisco un metodo della classe base


public virtualstring ChiSei()
Nella classe base aggiungo la parola
virtual
public override string C hiSei() {
string result = base.ChiSei();
result = result + "\n" + "La m ia m atricola " +
m atricola;
return result;
}
Nella sottoclasse aggiungo la parola
override prima del metodo

C#

19

Override(2)

Metodo alternativo:
public new string C hiSei() {
string result = base.C hiSei();
result = result + "\n" + "La m ia m atricola " +

m atricola;

return result;
}

Nella sottoclasse aggiungo la parola new


prima del metodo

In realt new nasconde la definizione della classe base


con lo stesso nome
Il comportamento risultante diverso rispetto a
override

C#

20

new Vs override

Studente m ario = new Studente("M ario", "Verdi");


m ario.Em ail= "m ario@ polim i.it";
string rit = m ario.ChiSei();
C onsole.W rite(rit);
Casting, uso mario come un
oggetto Persona

C onsole.W rite("\n\n");
rit = (m ario as Persona).ChiSei();
C onsole.W rite(rit);
C onsole.ReadKey();

C#

21

new Vs override

Se uso new

Se uso virtual+overrid

DerivedClass B = new
DerivedClass();

DerivedClass B = new
DerivedClass();

B.DoWork();

B.DoWork();

// Calls the new method.

// Calls the new method.

BaseClass A = (BaseClass)B;

BaseClass A = (BaseClass)B;

A.DoWork();

A.DoWork();

// Also calls the old method.

// Also calls the new method.

C#

Classi e metodi sealed

22

public sealed class D { // Class members here. }


Una classe sealed non pu essere utilizzata come
classe base.
public class D : C {
public sealed override void DoWork() { }
}
La parola chiave sealed prima della parola chiave
override nega l'aspetto virtuale del membro per
qualsiasi ulteriore classe derivata. Non si pu utilizzare
override nelle sottoclassi.

C#

Classi e metodi abstract

23

Non possibile creare un'istanza di una classe astratta.


Scopo di una classe astratta di fornire una definizione comune
di una classe base condivisibile da pi classi derivate.
public abstract class A { // Class members here. }
Le classi astratte possono inoltre definire metodi astratti
aggiungendo la parola chiaveabstractprima del tipo restituito
del metodo
public abstract class A {
public abstract void DoWork(int i);
}
I metodi astratti non prevedono implementazione
La definizione del metodo seguita da un punto e virgola.

Le classi derivate della classe astratta devono implementare tutti


i metodi astratti.

C#

interface

24

Le interfacce vengono definite tramite la parola chiave


interface

Un'interfaccia un gruppo completamente astratto di membri che


pu essere considerato come la definizione di un contratto: chi
implementa una interfaccia si impegna a scrivere il codice per
ciascun metodo.

I membri delle interfacce sono automaticamente pubblici.


public interface IEsem pio {
void M etodo1();
boolM etodo2();
string Proprieta1 { get; set; }
int Proprieta2 { get; }
}
public class Esem pio : Iesem pio{// Implementazione. }

C#

Delegati

25

Meccanismo per associare ad un


metodo un implementazione realizzata
da unaltro metodo
Simile ai puntatori a finzione del C e alle
callback di C++
I delegati si possono sommare (+=) e
sottrarre (-=)

C#

26

Delegati(2)

public delegate double D elegato(double dVal); // dichiaro un m etodo che pu essere delegato
class Program

static void M ain(string[] args)

Program pr = new Program ();


// associo alm etodo delegato una im plem entazione
D elegato q = new D elegato(pr.Q uadrato);
q + = new D elegato(pr.Cubo);
// eseguo le norm alioperazionisuldelegato
double dVal= D ouble.Parse(Console.ReadLine());
dVal= q(dVal);

Console.ReadKey();

//im plem entazione delm etodo quadrato


public double Q uadrato(double dVal) {
Console.W riteLine("sono ildelegato calcolo ilquadrato di" + dVal+ " : " + dVal*dVal);
dVal*dVal; }

return

//im plem entazione delm etodo cubo


public double Cubo(double dVal) {
Console.W riteLine("sono ildelegato calcolo ilcubo di" + " : " + dVal* dVal*dVal); return dVal* dVal*
dVal; }
}

C#

Eventi

27

Gli eventi sono simili alle chiamate di metodo,


ma la loro invocazione deve essere generata
esternamente.
Un esempio la pressione di un pulsante in
una interfaccia grafica o una pagina web.
Tramite gli eventi una classe o un oggetto sono
in grado di segnalare ad altre classi o oggetti
una situazione di interesse.
La classe che genera l'evento chiamata
autore e le classi che gestiscono l'evento sono
chiamate hendler.

C#

28

Eventi(2)

class O ggettoC onEvento


{
public event EventH andler nuovoEvento;
public void ScatenaEvento(

if (nuovoEvento != null)
nuovoEvento(this, EventArgs.Em pty);

class Program

static void M ain(string[] args) {


O ggettoC onEvento obj= new O ggettoC onEvento();
obj.nuovoEvento + = new EventH andler(obj_nuovoEvento);
System .Threading.Thread.Sleep(1000*4);
obj.ScatenaEvento();

static void obj_nuovoEvento(object sender, EventArgs e)


Console.W riteLine("si scatenato un evento");
Console.ReadKey();
}