Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà

Documenti analoghi
La classe java.lang.object

18 - Classi parzialmente definite: Classi Astratte e Interfacce

Esempi in Java di program.ne O-O

Ricerca e ordinamento su array di oggetti. Corso di Programmazione 2 Esercitazione 5

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Classi astratte. Nella gerarchia delle classi, potrebbe essere utile prevedere un supertipo generale per le classi che si usano. Ad esempio: Figura

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

Il Linguaggio Java. Le interfacce

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Programmazione a oggetti

Ereditarietà (ultima)

SOMMARIO IL PROBLEMA DELLA RICERCA. Algoritmi di ricerca: Algoritmi di ordinamento: RICERCA LINEARE

Ereditarietà e Polimorfismo. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali

3. un metodo che restituisce l elenco delle matricole di tutti gli studenti del corso;

Gerarchia di classi Java 1

Interfacce. Un interfaccia Java è una collezione di metodi astratti (e di costanti) Un metodo astratto è un metodo non implementato

L ereditarieta` Riuso del software: Ereditarieta`, Composizione, Polimorfismo e Binding Dinamico Ereditarietà Ereditarietà

Programmazione Orientata agli Oggetti

Uguaglianza e copia di oggetti

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

public BankAccount() { balance = 0; } public BankAccount(double initialbalance) { balance = initialbalance; }

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

Obiettivi. Comprendere i vantaggi offerti dal meccanismo dell ereditarietà Attivare processi di astrazione e specializzazione.

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

Esempio: Interfacce. Gioco Interfacce

Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.

Capitolo 6. Uso della gerarchia. c 2005 Pearson Education Italia Capitolo 6-1 / 125

Esercitazione n 2. Obiettivi

Classi e array. Viene ora affrontato un problema di definizione di una classe in cui una variabile d istanza è di tipo array

Programmazione orientata agli oggetti Classi astratte e interfacce

Le basi del linguaggio Java

Programmazione Java Avanzata Programmazione Object- Oriented in Java

Java: Definire Classi e Creare Oggetti

Catia Trubiani. Laboratorio di Ingegneria del Software a.a

Esempio: Interfacce. Gioco Interfacce

ESERCIZI JAVA. Esercizi sulle Interfacce. Esercizio 1:

Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Esempio 2: Subtyping

Fondamenti di Informatica T-1. Ereditarietà & Polimorfismo

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Programmazione a Oggetti Lezione 10. Ereditarieta

Programmazione II Compitino (Vers. B)

Riassunto. La programmazione OO. Oggi. Esempio

Capitolo 9. Tipi enumerativi, tipi generici e interfacce. c 2005 Pearson Education Italia Capitolo 9-1 / 73

IL CONCETTO DI CLASSE

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Fondamenti di Informatica T-1. Costruttori Ereditarietà

16 - Ereditarietà, tipi e gerarchie

Programmazione a Oggetti. Ereditarieta

Classi, Ereditarietà e Polimorfismo. Lezione 7

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

INFORMATICA GRAFICA - FONDAMENTI DI INFORMATICA Ing. Civile - Edile/Architettura Dott. Penzo SOLUZIONE PROVA SCRITTA DEL 16/09/2002.

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

PROGRAMMAZIONE A OGGETTI (OOP) Lezione 8 prj Mesa (Prof. Ing N. Muto)

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Introduzione a C# Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Laboratorio di Programmazione 1 [Java]

Fondamenti di Informatica I

Alberi Binario in Java

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Informatica 3. LEZIONE 8: Fondamenti di programmazione orientata agli oggetti (2)

Fondamenti di Informatica L-B Esercitazione n 5 Java: Interfaccia Comparable, Array

In questa lezione. Polimorfismo

Informatica 3. Informatica 3. LEZIONE 8: Fondamenti di programmazione orientata agli oggetti (2) Lezione 8 - Modulo 1

Algoritmi di Ricerca. Esempi di programmi Java

La classe Object. L2-Linguaggi di Programmazione II-unina 1

Programmazione ad oggetti

Metodi statici. Dichiarazione e chiamata di metodi statici

Ereditarietà e polimorfismo

Proprietà delle Classi e degli Oggetti in Java

Astrazioni sui dati : Specifica di Tipi di Dato Astratti in Java

Esercizi della lezione 5 di Java

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Uso di classi e oggetti. Prof. Francesco Acarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Algoritmi di Ricerca. Esempi di programmi Java

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Programmazione Java: Variabili membro, Metodi La parola chiave final

Corso di Laurea in Matematica Corso di Informatica Prova d Esame del 02/02/2010

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

Implementazione Java di un ADT

Per indicare la complessità asintotica si usa la notazione O-grande (Big-Oh):

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Eredità e Polimorfismo in Java

Ingegneria del Software

Esempio su strutture dati dinamiche: ArrayList

Programmazione Java Variabili membro, Metodi La parola chiave final

Design Pattern Comportamentali

Insieme.java. Printed by Paolo. Feb 24, 04 16:44 Page 1/1 class Insieme { private int[] elementi; Tuesday February 24, /10

Programmazione a oggetti e JAVA. Prof. B.Buttarazzi A.A. 2011/2012

Sommario. Introduzione... xv. Giorno 1 Elementi base del linguaggio C

Il linguaggio C# Ereditarietà ed Interfacce

Multithreading in Java I parte. Lorenzo Gallucci

Oggetti. Interfacce e sottotipi

Laboratorio di Programmazione 1 [Java]

Transcript:

L ereditarietà è il meccanismo attraverso cui viene implementata la relazione di specializzazione (is-a). L ereditarietà è il meccanismo attraverso cui una classe (derivata) eredita da un altra classe (base) tutti i suoi membri, i suoi metodi e le sue proprietà per estenderne il comportamento, aggiungendo altri membri, altri metodi e altre proprietà. In C# non è permessa l ereditarietà multipla: è possibile derivare da una sola classe base. Strutture Software 1 - e interfacce 1 class A private string a; private int b; public void MethodA(); class B: A private int c; public void MethodB() classe base classe derivata da A: eredita tutti i membri e i metodi di A e può specificarne il comportamento aggiungendone altri. Strutture Software 1 - e interfacce 2 class Persona protected string nome; public Persona(string n) nome = n; public string Nome get return nome; set nome = value; Definiamo una classe base, ad esempio la classe Persona, contenente alcune variabili e alcune properties. Strutture Software 1 - e interfacce 3 Attraverso il meccanismo dell ereditarietà è possibile estendere il comportamento della classe base (Persona) per poter descrivere un particolare tipo di persona (ad esempio Studente). La classe derivata Studente avrà tutte le variabili, proprietà e metodi della classe Persona, ma potrà definirne di nuovi, specializzando il comportamento della classe base. Strutture Software 1 - e interfacce 4

class Studente : Persona private int matricola; public Studente(string n, int m):base(n) matricola = m; viene richiamato il costruttore della classe base public int Matricola get return matricola; set matricola = value; Strutture Software 1 - e interfacce 5 class Program static void Main(string[] args) Persona a =new Persona( Maria"); Console.WriteLine(a.Nome); Studente b = new Studente("Gianni", 123456); Console.WriteLine(b.Nome + " " + b.matricola); Maria Gianni 123456 Strutture Software 1 - e interfacce 6 class Persona public void Stampa() Console.WriteLine("Metodo Stampa() classe Persona"); Console.WriteLine(nome); class Studente:Persona public new void Stampa() Console.WriteLine(""); Console.WriteLine(nome + " " + matricola); Il modificatore new indica che il metodo della classe derivata nasconde quello della classe base nome è dichiarato protected quindi è visibile dalla classe derivata Strutture Software 1 - e interfacce 7 static void Main(string[] args) Persona a =new Persona("Maria"); Studente b = new Studente("Gianni", 123456); a.stampa(); b.stampa(); Persona c = new Studente("Marco", 444555); c.stampa(); //Console.WriteLine(c.Nome + " " + c.matricola); ((Studente)c).Stampa(); Console.WriteLine(((Studente)c). Nome + " " + ((Studente)c).Matricola); Metodo Stampa() classe Persona Maria Gianni 123456 Metodo Stampa() classe Persona Marco Strutture Software 1 - e interfacce Marco 444555 8 Marco 444555

e polimorfismo Per creare metodi che possano essere utilizzati in maniera polimorfica si possono identificare come virtual nelle classi base. Le classi derivate potranno poi fornire la loro propria implementazione di tali metodi mediante la parola chiave override. L esempio precedente può essere modificato dichiarando virtual il metodo Stampa() della classe Persona, ed effettuando un override di tale metodo nella classe derivata Studente. e polimorfismo class Persona public virtual void Stampa() Console.WriteLine("Metodo Stampa() classe Persona"); Console.WriteLine(nome); class Studente:Persona public override void Stampa() Console.WriteLine(""); Console.WriteLine(nome + " " + matricola); Strutture Software 1 - e interfacce 9 Strutture Software 1 - e interfacce 10 e polimorfismo - Object static void Main(string[] args) Persona a =new Persona("Maria"); Studente b = new Studente("Gianni", 123456); a.stampa(); b.stampa(); Persona c = new Studente("Marco", 444555); c.stampa(); Viene richiamato il metodo Stampa() della classe derivata. Metodo Stampa() classe Persona Maria Gianni 123456 Marco 444555 Tutte le classi in C# derivano da System.Object Ogni classe può essere, a sua volta, classe base per una sua classe derivata: Object è in cima alla gerarchia di classi. Object fornisce alcuni metodi virtuali che possono essere sovrascritti dalle classi derivate, tra cui: public virtual bool Equals(object obj); public virtual string ToString(); Strutture Software 1 - e interfacce 11 Strutture Software 1 - e interfacce 12

Interfacce Un interfaccia descrive un comportamento che può appartenere a qualsiasi classe: è un contratto che garantisce al cliente come una classe si comporterà. Le interfacce sono composte da metodi, proprietà, eventi, indexer. Non contengono campi. I membri delle interfacce sono pubblici. I metodi e i membri delle interfacce sono astratti, non provvedono un implementazione di default. Quando una classe implementa un interfaccia DEVE implementare tutti i suoi metodi e proprietà. Una classe può implementare più di un interfaccia. Le interfacce possono essere derivate. Interfacce Definiamo un interfaccia IPrezzo contenente il metodo GetPrezzo() interface IPrezzo double GetPrezzo(); Tutte le classi per cui è necessario prevedere un prezzo e un metodo che ritorni tale prezzo potranno implementare tale interfaccia e definire il comportamento più appropriato per il metodo GetPrezzo(). Strutture Software 1 - e interfacce 13 Strutture Software 1 - e interfacce 14 Interfacce Interfacce public class Pc : IPrezzo string nome; double processore; double prezzo; public Pc(double p) prezzo = p; public double GetPrezzo() return prezzo; La classe Pc implementa l interfaccia IPrezzo. Dovrà quindi fornire un implementazione per il metodo GetPrezzo() Strutture Software 1 - e interfacce 15 public class RAM : IPrezzo int numeromoduli; double prezzounitario; public RAM(int n, double p) numeromoduli = n; prezzounitario = p; La classe RAM implementa l interfaccia IPrezzo. L implementazione del metodo GetPrezzo() è in questo caso differente. public double GetPrezzo() return numeromoduli * prezzounitario; Strutture Software 1 - e interfacce 16

Interfacce static void Main(string[] args) RAM ram1 = new RAM(2, 99.9); Si accede ai metodi dell interfaccia come agli altri metodi della classe. Console.WriteLine("Prezzo pc1: " + pc1.getprezzo()); Console.WriteLine("Prezzo ram1: "+ ram1.getprezzo()); Prezzo pc1: 1000 Prezzo ram1: 199,8 Strutture Software 1 - e interfacce 17 Le classi Pc e RAM non sono legate da ereditarietà, ma implementano entrambe l interfaccia IPrezzo. Analogamente altre classi potranno implementare tale interfaccia. Non si può istanziare un interfaccia direttamente, ma si può istanziare un oggetto che implementa tale interfaccia e poi effettuare un cast. Pc pc1 = new Pc(999.99) IPrezzo ispc1 = pc1; Utilizzando le interfacce si possono ottenere comportamenti polimorfici, si possono quindi trattare nello stesso modo oggetti di tipo diverso sfruttando il fatto che implementano la stessa interfaccia. Strutture Software 1 - e interfacce 18 static void Main(string[] args) IPrezzo[] a = new IPrezzo[2]; a[0] = new Pc(700.0); a[1] = new RAM(4,80.50); for (int i = 0; i < a.length; i++) Console.WriteLine(a[i].GetPrezzo()); Array di oggetti che implementano l interfaccia IPrezzo Spesso non è possibile sapere se un oggetto implementa una determinata interfaccia, è possibile effettuare un cast: IPrezzo ispc = (IPrezzo)pc1; Se si effettua un cast illegale, come nell esempio seguente, viene lanciata un eccezione runtime Persona persona1 = new Persona("Maria"); IPrezzo ispersona = (IPrezzo)persona1; Strutture Software 1 - e interfacce 19 Strutture Software 1 - e interfacce 20

E quindi possibile controllare se una classe implementa una determinata interfaccia mediante le parole chiave is ed as Persona persona1 = new Persona("Maria"); IPrezzo ispc; IPrezzo ispersona; if (pc1 is IPrezzo) ispc = (IPrezzo)pc1; else Console.WriteLine("pc1 non implementa IPrezzo"); if (persona1 is IPrezzo) ispersona = (IPrezzo)persona1; else Console.WriteLine("persona1 non implementa IPrezzo"); IPrezzo ispc = pc1 as IPrezzo; if(ispc==null) Console.WriteLine("pc1 non implementa IPrezzo"); IPrezzo ispersona = persona1 as IPrezzo; if (ispersona == null) Console.WriteLine("persona1 non implementa IPrezzo"); Utilizzando la parola chiave as se il cast non è valido il reference (in questo caso ispersona) avrà il valore null Strutture Software 1 - e interfacce 21 Strutture Software 1 - e interfacce 22 Interfacce - Esempio Supponiamo di voler realizzare una funzione che aggiunga un oggetto qualunque ad un carrello, tenendo traccia del numero totale di oggetti nel carrello e del prezzo totale. Tale funzione dovrà essere generale, qualunque oggetto che implementi l interfaccia IPrezzo potrà essere aggiunto al carrello. static bool AggiungiCarrello(object el, object[] car, ref int numel, ref double tot) Strutture Software 1 - e interfacce 23 Interfacce - Esempio static bool AggiungiCarrello(object el, object[] car, ref int numel, ref double tot) if (el is IPrezzo && numel < car.length) car[numel] = el; numel++; tot += ((IPrezzo)el).GetPrezzo(); return true; numel e tot sono passati per riferimento cast necessario per ottenere la specificità di el controlliamo che el implementi l interfaccia else Console.WriteLine("el non implementa l'interfaccia IPrezzo"); return false; Strutture Software 1 - e interfacce 24

Interfacce - Esempio static void Main(string[] args) IPrezzo[] carrello = new IPrezzo[10]; double totale = 0; int elementi = 0; AggiungiCarrello(pc1, carrello, ref elementi, ref totale); Console.WriteLine("elementi presenti: " + elementi); Console.WriteLine("totale: " + totale); RAM ram1 = new RAM(2, 99.90); AggiungiCarrello(ram1, carrello, ref elementi, ref totale); Console.WriteLine("elementi presenti: " + elementi); Console.WriteLine("totale: " + totale); Persona persona1 = new Persona("Maria"); AggiungiCarrello(persona1, carrello, ref elementi, ref totale); Console.WriteLine("elementi presenti: " + elementi); Console.WriteLine("totale: " + totale); Strutture Software 1 - e interfacce 25 Interfacce - Esempio L output del programma è il seguente, Pc e RAM implementano l interfaccia e sono aggiunti al carrello, Persona non la implementa pertanto la funzione ritornerà false e verrà stampato il messaggio di errore: elementi presenti: 1 totale: 1000 elementi presenti: 2 totale: 1199,8 el non implementa l'interfaccia IPrezzo elementi presenti: 2 totale: 1199,8 Strutture Software 1 - e interfacce 26 Interfacce predefinite Come già visto la libreria standard del C# contiene interfacce predefinite, ad esempio per poter effettuare confronti tra oggetti. Ad esempio l interfaccia IComparable è definita nel seguente modo: interface IComparable // compare the current object to the object o ; return a // 1 if larger, -1 if smaller, and 0 otherwise int CompareTo(object o); Le classi che implementano tale interfaccia dovranno implementare il metodo CompareTo nella maniera più opportuna. Strutture Software 1 - e interfacce 27 Interfacce predefinite Un ulteriore interfaccia presente nella libreria standard del C# è l interfaccia IComparer, definita nel modo seguente: interface IComparer int Compare(object x, object y); Tale interfaccia viene implementata per fornire un ulteriore criterio di confronto (diverso da CompareTo). Come si è visto l interfaccia non viene implementata direttamente dal tipo che si vuole confrontare ma da una classe separata. Strutture Software 1 - e interfacce 28