Programmazione ad oggetti. Paradigma a oggetti. Esempio. Esempio L estensione del tipo di dato comporta la ridefinizione del codice

Documenti analoghi
Paradigma a oggetti. Programmazione orientata agli oggetti. Programmazione orientata agli oggetti Paradigma a oggetti 1 / 30

Programmazione in Java (I modulo) Lezione 20: Ereditarietà

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

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

Concetti Base Encapsulation ed Ereditarietà Programmare con l Ereditarietà. Java: Ereditarietà. Damiano Macedonio

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

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

Ereditarietà e Polimorfismo

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

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

Programmazione Orientata agli Oggetti

Programmazione orientata agli oggetti Ereditarietà

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

Esempio 2: Subtyping

IL CONCETTO DI CLASSE

Progettazione Object-Oriented

Programmazione in Java (I modulo) Lezione 21: Classi derivate e l'operatore instanceof Riscrivere il metodo tostring() Riscrivere il metodo equals()

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

NON ABBIAMO ANCORA CORRETTO LE PROVETTE!!!

IL TEMA DELLA RIUSABILITÀ

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

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

Programmazione orientata agli oggetti Ereditarietà

Gerarchia di classi Java 1

Gerarchia di classi Java 1

Ereditarietà: concetti di base

ereditarietà e polimorfismo

Paradigmi della PO. Incapsulamento. Ereditarietà. Polimorfismo. Software per TLC - AA 2008/2009 1

Programmazione orientata agli oggetti Ereditarietà

Concetti principali Ereditarietà e (overriding) di metodi. Ereditarietà e costruttori Livelli di accesso protected e package La classe Object

Programmazione orientata agli oggetti Ereditarietà

Riuso di classi. Ereditarietà. Ereditarietà. Spesso si ha bisogno di classi simili

18 - Classi parzialmente definite: Classi Astratte e Interfacce

17 - Classi parzialmente definite: Classi Astratte e Interfacce

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

Programmazione orientata agli oggetti Subtyping e polimorfismo. Subtyping-polimorfismo

Programmazione orientata agli oggetti

Programmazione orientata agli oggetti Subtyping e polimorfismo. Subtyping-polimorfismo

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

Corso di Linguaggi di Programmazione

La classe java.lang.object

Ereditarietà. Unità 9. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Il paradigma di programmazione OO

Oggetti. La programmazione orientata agli oggetti, OOP (Object-Oriented Programming), prende il nome dall elemento su cui si basa, l oggetto.

Proprietà delle Classi e degli Oggetti in Java

PROGRAMMAZIONE 2 4. Java: un modello operazionale

Ereditarietà. Linguaggi di Programmazione: Paradigmi di Programmazione. Ereditarietà. Sottoclassi. Ereditarietà. Controllo statico dei tipi

OOP Ereditarietà A. FERRARI

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

Programmazione Java Avanzata Programmazione Object- Oriented in Java

Programmazione a oggetti

Proprietà delle Classi e degli Oggetti in Java

Corso di Progettazione del Software

Programmazione ad oggetti

Ingegneria del Software

public class Counter2 extends Counter { public void dec() { val--; }

Laboratorio di Sistemi Polimorfismo Java. Prerequisiti: per la comprensione dell'articolo è necessario conoscere il concetto di Ereditarietà in Java.

OLTRE LE CLASSI OLTRE LE CLASSI

Astrazione Dati. Nicola Fanizzi. Linguaggi di Programmazione [010194] 10 mag, Dipartimento di Informatica Università degli Studi di Bari

Ereditarietà. Una classe, detta superclasse, può essere specializzata definendo una sottoclasse che ne contenga casi particolari.

Programmazione orientata agli oggetti Subtyping e polimorfismo. Subtyping-polimorfismo

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

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

Programmazione orientata agli oggetti Classi astratte e interfacce. Classi astratte - Interfacce

Modello procedurale versus modello O-O

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

Bank account. private double balance; 11/2/2011

Programmazione orientata agli oggetti Classi astratte e interfacce. Classi astratte - Interfacce

Il linguaggio C++ Ugo de Liguoro

RIUSABILITÀ L OBIETTIVO

Linguaggi di Programmazione

INGEGNERIA DEL SOFTWARE

Un tipo di dato astratto (ADT) definisce una categoria concettuale con le sue proprietà: una definizione di tipo

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Dichiarazione di una classe. Dichiarazione ereditarietà

PROGRAMMAZIONE 2 4. Un modello operazionale per Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Fondamenti di Informatica

Gli oggetti. Ogni oggetto ha un interfaccia e ogni oggetto ha un tipo. Incapsulamento. Oggetti. Contatore. Invio di Messaggi

Laboratorio di programmazione

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

Principi di Progettazione del Software a.a

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

Il Linguaggio Java. Le interfacce

Programmazione orientata agli oggetti Classi astratte e interfacce

Ereditarietà (ultima)

Ereditarietà (ultima)

OLTRE LE CLASSI OLTRE LE CLASSI OLTRE LE CLASSI OLTRE LE CLASSI. Alcune domande. Nella sua parte non statica, una classe

Java: Basics della Programmazione in Piccolo

Ereditarietà. Ivan Lanese e Cosimo Laneve

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

Esempio: Costruttori ed ereditarietà

Ingegneria del Software

Esempi in Java di program.ne O-O

Programmazione ad oggetti

Transcript:

Programmazione ad oggetti. Paradigma a oggetti Programmazione orientata agli oggetti Si estendono i tipi di dati astratti che permettono: information hiding e incapsulamento nascondo la rappresentazione interna del dato le funzioni base sui dati, che accedono alla rappresentazione definite insieme ai dati con meccanismi che permettono: estensione dei dati con riuso del codice (ereditarietà) compatibilità tra tipi (sottotipi) selezione dinamica dei metodi Programmazione orientata agli oggetti Paradigma a oggetti 1 / 30 Programmazione orientata agli oggetti Paradigma a oggetti 2 / 30 Definisco il tipo di dato contatore, Esempio Esempio L estensione del tipo di dato comporta la ridefinizione del codice abstype Counter { type Counter = int; signaturue voic reset (Counter c); int get (Counter c); void inc (Counter c); operartions void reset (Counter c){ c = 0 void get (Counter c){ return c... Programmazione orientata agli oggetti Paradigma a oggetti 3 / 30 abstype NewCounter { type NewCounter = struct{ int count int resets = 0; signaturue void reset (NewCounter c); int get (NewCounter c); void inc (NewCounter c); operartions void reset (NewCounter c){ c.count = 0; c.resets = c.resets + 1; void get (NewCounter c){ Programmazione orientatareturn agli oggetti c.counts Paradigma a oggetti 4 / 30

Obiettivi, linguaggio OO Oggetti Estendere un tipo di dato astratto (NewCounter), potendo ereditare (parte del codice) (di Counter) Poter utilizzare il tipo di dato esteso (NewCounter) in contesti che accettano il tipo di dato originale (Counter); compatibilità tra tipi Selezione dinamica dei metodi procedure che usino in maniera uniforme Counter e NewCounter devo decidere, a tempo di esecuzione, quale implementazione del metodo reset utilizzare. Un oggetto è una capsula (record, struct)che contiene: dati: pubblici o private: variabili metodi, procedure: pubbliche o private, associate ai dati Un programma orientato agli oggetti: invocare un metodo su un oggetti un oggetto risponde, eseguendo la procedura associata, stato confinato negli oggetti Programmazione orientata agli oggetti Paradigma a oggetti 5 / 30 Programmazione orientata agli oggetti Paradigma a oggetti 6 / 30 Classi Possiamo raggruppare gli oggetti con la stessa struttura in Classi una classe è un modello di un insieme di oggetti: quali dati nome, segnatura e visibilità delle operazioni (metodi) codice per i metodi. Oggetti creati dinamicamente per istanziazione di una classe, mediante costruttori class Counter { private int x; public void reset (){ x = 0 public void get (){ return x; Programmazione orientata agli oggetti Paradigma a oggetti 7 / 30 il meccanismo delle classi permette: Classi information hiding e incapsulamento (nascondo le informazione all interno di oggetti o metodi) private e public astrazione sui dati e sul controllo assegno un nome alla classe e ai medodi estensibilità e riuso del codice Programmazione orientata agli oggetti Paradigma a oggetti 8 / 30

Linguaggi prototype based Oggetti come record JavaScript I linguaggi OO si distinguono in: class based: più comuni Prototype based (objcet-based): oggetti come record con metodi. non sono necessari, pattern predefiniti JavaScript il principale esponente dei prototyped based nessuna parentela con Java, linguaggi di default per introdurre codice in pagine html, Programmazione orientata agli oggetti Paradigma a oggetti 9 / 30 var person = {firstname:"john", lastname:"doe", age:50, name = function () { return this.firstname + " " + this.lastname; ; Oggetti estensibili: posso aggiungere nuovi dati o metodi person.eyecolor = blue; linguaggio con tipi dinamici, controllo dei tipi a runtime nessuna distinzione tra dati e metodi, formalmente ogni oggetto contiene i propri metodi che vengono replicati, o ridefiniti implementazione: si memorizza un puntatore a metodi condivisi. Programmazione orientata agli oggetti Paradigma a oggetti 10 / 30 Possibilità di definire dei costruttori JavaScript: prototype function Person(first, last, age) { this.firstname = first; this.lastname = last; this.age = age; this.name = function () { return this.firstname + " " + this.lastname;; var myfather = new Person("John", "Doe", 50); Possibilità di estendere i costruttori JavaScript: costruttori predefiniti Costruttori predefiniti, creano oggettti standard con un ricco insieme di metodi var x1 = new Object(); var x2 = new String(); var x3 = new Number(); var x4 = new Boolean(); var x5 = new Array(); var x6 = new RegExp(); var x7 = new Function(); var x8 = new Date(); // A new Object object // A new String object // A new Number object // A new Boolean object // A new Array object // A new RegExp object // A new Function object // A new Date object Person.prototype.altName = function() { return this.lastname + " " + this.firstname; Programmazione orientata agli oggetti Paradigma a oggetti 11 / 30 Programmazione orientata agli oggetti Paradigma a oggetti 12 / 30

JavaScript: meccanismo delle closure function counter() { var count = 0; return function() { return ++count; ; var closure = counter(); closure(); // returns 1 closure(); // returns 2 closure fa riferimento all ambiente in cui è stata definita count defininita in questo ambiente viene preservata (e incrementata) information hiding, la variabile count accessibile solo attraverso closure Information hiding non disponibile in forma esplicita. Programmazione orientata agli oggetti Paradigma a oggetti 13 / 30 this e self All interno dei metodi di un oggetto faccio riferimento ad altri metodi o campi dell oggetto stesso questo può essere fatto in maniera esplicita: this.field, self.field (a seconda del linguaggio) per affermare che faccio riferimento ad un campo interno implicita: nel metodo appare solo field Programmazione orientata agli oggetti Paradigma a oggetti 14 / 30 Memorizzazione Incapsulamento Le classi garantiscono incapsulamento Dove creare oggetti e classi, heap, soluzione più diffusa naturale per oggetti creati dinamicamente stack, usata in C++, possibile per oggetti definiti come variabili locali di procedure opportuni modificatori determinano se campi e metodi sono pubblici privati protetti la parte pubblica definisce l interfaccia della classe la parte privata è usata nell implementazione protetti definisce una parte privata, visibile nelle sottoclassi Programmazione orientata agli oggetti Paradigma a oggetti 15 / 30 Programmazione orientata agli oggetti Paradigma a oggetti 16 / 30

Sottoclassi Posso estendere classi con nuovi metodi o campi, Ridefinizione di metodo (overriding) NewCounter contemporaneamente: NamedCounter è una sottoclasse (o classe derivata) di Counter: ogni istanza di NamedCounter risponde a tutti i metodi di Counter il tipo NamedCounter è compatibile con Counter Programmazione orientata agli oggetti Paradigma a oggetti 17 / 30 estende l interfaccia di Counter con nuovi campi ridefinisce il metodo reset Un messaggio reset inviato ad un istanza di NewCounter causa l invocazione del nuovo codice Programmazione orientata agli oggetti Paradigma a oggetti 18 / 30 Relazione di sottotipo Relazione di sottotipo Un tipo può avere più di un sovratipo immediato C sottotipo sia di A che di B In generale classe T sottotipo di S quando T possiede tutti i metodi di S T compatibile con S, nei contesti T posso inserire un oggetto S relazione di sottotipo una relazione d ordine Object classe più generale di tutti, elemento massimo contiene metodi comuni a tutte le classi (creazione, uguaglianza) Programmazione orientata agli oggetti Paradigma a oggetti 19 / 30 Programmazione orientata agli oggetti Paradigma a oggetti 20 / 30

Classi astratte Nell esempio precedente vengono usate classi astratte: si definisce tipo dei campi e metodi, ma non il codice dei metodi semplici dichiarazioni di tipo in Java solo quando i sovratipi sono interface permette ad una classe di essere sottotipo di classi tra loro scorrelate la gerarchia dei sottotipi non è un albero, Ereditarietà Meccanismo per il riutilizzo e la condivisione del codice in un esempio precedente, qui riportato NewCounter eredita da Counter i metodi (e i campi) non ridefiniti l ereditarietà permette il riuso del codice in un contesto estendibile: ogni modifica all implementazione di un metodo in una classe automaticamente disponibile a tutte le sottoclassi Programmazione orientata agli oggetti Paradigma a oggetti 21 / 30 Programmazione orientata agli oggetti Paradigma a oggetti 22 / 30 Ereditarietà e sottotipo Ereditarietà e sottotipo Sottotipo meccanismo che permette di usare un oggetto in un altro contesto, è una relazione tra le interfacce di due classi. Ereditarietà meccanismo per riusare il codice dei metodi, è una relazione tra le implementazioni di due classi. Due concetti formalmente indipendenti ma spesso collegati nei linguaggi OO, l eredititarietà dei metodi implica ad una relazione di sottotipo. sia C++ che Java hanno costrutti che introducono contemporaneamente entrambe le relazioni tra due classi in Java extends introduce sia ereditarietà e sottotipo implements solo sottotipo Programmazione orientata agli oggetti Paradigma a oggetti 23 / 30 Programmazione orientata agli oggetti Paradigma a oggetti 24 / 30

Ereditarietà singola e multipla Name-clash nell ereditarietà multipla Singola (Java) ogni classe extetend una sola superclasse eredita al più da una sola superclasse immediata Multipla (C++) una classe può ereditare da più di una superclasse immediata Ereditarietà multipla più flessibile il riuso del codice fonte di problemi name clash: se lo stesso metodo definito nelle due superclassi, quale metodo ereditare? Programmazione orientata agli oggetti Paradigma a oggetti 25 / 30 Programmazione orientata agli oggetti Paradigma a oggetti 26 / 30 Name-clash nell ereditarietà multipla Nell esempio precedente quale metodo f eredita Bottom quello ereditato nella classe A quello ridefinito della classe B Possibile soluzioni: impedisco ogni conflitto tra metodi impongo che ogni conflitto venga risolto nel codice, specificando quale definizione usare (C++) definisco una criterio di scelta dei metodi Soluzione sofisticata, alternative all ereditarietà multipla, Mixin si permette un riutilizzo del codice, evitando le ambiguità dell ereditarietà multipla si incorporano metodi da una classe senza diventarne sottoclasse, realizzato in varie forme in diversi linguaggi (Ruby, Non esiste una soluzione ottimale, per ciascuna delle precedenti si possono fare esempi in cui risulta innaturale. Programmazione orientata agli oggetti Paradigma a oggetti 27 / 30 Programmazione orientata agli oggetti Paradigma a oggetti 28 / 30

interface A{ int f(); interface B{ int g(); class C{ int x; int h(){ return x+2 class D extends C implements A, B{ int f(){ return x ; int g(){ return h() ; Java ereditarietà singola. Programmazione orientata agli oggetti Paradigma a oggetti 29 / 30 Selezione dinamica dei metodi Un metodo m viene invocato su un oggetto: vi possono essere più versioni di m (per overriding e sottotipi) come avviene la scelta di quella davvero invocata? Esempio Counter V[100];... for (Counter cont : V){count.reset() V può contenere elementi di tipo Counter che NewCounter Selezione dinamica a tempo d esecuzione, in funzione del tipo dell oggetto che riceve il messaggio selezione determinata dal tipo dell oggetto, non dal tipo del riferimento count all oggetto Programmazione orientata agli oggetti Paradigma a oggetti 30 / 30