Programmazione orientata agli oggetti con C# e VB. NET nel

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

© 2007 SEI-Società Editrice Internazionale, Apogeo Unit à B2 Gli oggetti: concetti avanzati.
Costruttori e Distruttori
Recupero debito quarto anno Primo incontro
Recupero debito quarto anno Secondo incontro
Informatica Recupero debito quarto anno Terzo incontro.
Visual Studio Tools For Office 2005 Fabio Santini. NET Senior Developer Evangelist Microsoft Italy.
Consumare Web Service Andrea Saltarello
Sharepoint Gabriele Castellani
Informatica 2 Lezione 4 Corso di laurea in matematica Informatica 2 Dott. Ing. Leonardo Vito Corso di laurea matematica indirizzo matematica per le applicazioni.
Programmazione object oriented in C++
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Le gerarchie di tipi.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
Introduzione al linguaggio C++ 5 lezioni
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
Introduzione al linguaggio Java
Derivazione tra classi
Overriding.
Gestione dei Progetti Software 2 (a.a. 2004/05) - Lezione 3 1 JAVA e Internet: il World Wide Web Internet: milioni di computer collegati fra di loro attraverso.
Programmazione Corso di laurea in Informatica
Gerarchia di classi Java
Approfondimento delle classi
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
Lab. Calc. 2005/06 Ereditarietà. Lab. Calc. 2005/06 Scopo di questa lezione: Imparare a creare nuove classi ereditando da classi già esistenti. Capire.
1 Ereditarietà Una classe può essere derivata da una classe esistente usando la sintassi: public, protected e private specificano il tipo di accesso ai.
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Java base IV: Java e la programmazione O.O.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
C# LE BASI 2007 Prima lezione - Introduzione.
Programmazione in Java (8)
Ereditarietà e Polimorfismo
Introduzione alla programmazione Object Oriented
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Gestionale A.A. 2003/2004.
Fondamenti di Programmazione Prof.ssa Elisa Tiezzi
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
I nomi in Java F. Bombi 18 novembre novembre 2003.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Lezione 1 Panoramica sui paradigmi di programmazione
Oggetti in C# Lezione 5 Polimorfismo I Andrea Zoccheddu.
Programmazione ad oggetti
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Fondamenti di Informatica II Ingegneria Informatica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
Cose nuove di Java (prima a chiacchiera, poi formalmente)
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
Classi ed Oggetti in Java (Cenni). Richiami Cenni sull’ Implementazione, Macchine Astratte, Compilatore, Interprete Ruolo delle Classi in Java Oggetti.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
La Programmazione ad Oggetti
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
Corso di Algoritmi e Strutture Dati con Laboratorio A.A. 2015/16 Oltre le classi.
28/12/2001package 1 Package Pacchetti e interfacce.
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Introduzione alle Classi e agli Oggetti in Java 1.
Transcript della presentazione:

Programmazione orientata agli oggetti con C# e VB. NET nel Programmazione orientata agli oggetti con C# e VB.NET nel .NET Framework Silvano Coriani (scoriani@microsoft.com) Academic Developer Evangelist Developer & Platform Evangelism Microsoft Microsoft Certified Trainer Microsoft Certified Solution Developer Microsoft Certified Application Developer Microsoft Certified System Engineer + Internet Microsoft Certified DataBase Administrator

Agenda I concetti fondamentali L’implementazione nel .NET Framework Ereditarietà Polimorfismo Incapsulamento Aggregazione L’implementazione nel .NET Framework Classi base e derivate I metodi virtuali Classi astratte e interfacce Le keyword di C# e VB.NET

Object Oriented Programming In un ambiente OOP deve essere possibile applicare i seguenti concetti: Astrazione Sviluppare un’applicazione racchiudendone la complessità all’interno di moduli di classe, che ne implementano il significato Incapsulamento Proibire ad altri oggetti di manipolare direttamente dati, o procedure, implementate all’interno dell’oggetto stesso Classe come “scatola nera” per l’utilizzatore Polimorfismo Possibilità per classi diverse di implementare lo stesso “comportamento” sotto forma di metodi e di interfacce comuni a diverse classi Ereditarietà Possibilità di riutilizzare il codice già implementato in una classe base, e di specializzarne il funzionamento nella derivata

Ereditarietà Una classe può ereditare il comportamento di un’altra già esistente Classe base La classe base contiene il codice comune alle due classi definite La classe derivata definisce le specializzazioni della nuova classe rispetto alla base

Ereditarietà La derivazione individua la relazione “è un” Animale Cane Gatto Terranova Bassotto Siamese Selvatico

Polimorfismo Permette a un entità di comportarsi in modi differenti Implementata dai metodi virtuali Es. Animale.Mangia Un Gatto implementa Mangia in modo diverso da un Cane Cane e Gatto derivano da Animale Animale.Mangia richiamerà il metodo specifico dell’istanza corrente

Incapsulamento Principio secondo cui si “nascondono” i dettagli interni della classe Ogni elemento ha un criterio di visibilità Si rendono visibili all’esterno (pubblici) solo l’interfaccia verso il mondo esterno Futuri cambiamenti interni alla classe non si propagano al codice che la utilizza

Aggregazione Automobile L’aggregazione individua la relazione “ha un” Ruota Motore Pistone Pistone Pistone Pistone Cilindro Ruota Cilindro Cilindro Cilindro Centralina Ruota Volante Ruota

.NET Framework e OOP Vantaggi per lo sviluppatore: Codice potenzialmente più leggibile Manutenibilà delle applicazione e dei sistemi Modularità del codice Applicazioni “componentizzate”

Il Type System

Ereditarietà nel .NET Framework Ogni classe deriva sempre dalla classe base System.Object .class private auto ansi beforefieldinit Simple extends [mscorlib]System.Object Una classe può essere derivata da una e una sola classe base Una classe può implementare n interfacce Una interfaccia può ereditare da n altre interfacce

Ereditarietà Il costruttore chiama sempre un costruttore della classe base Implicito: chiama il costruttore di default Esplicito: si usa la keyword base Si può chiamare un altro costruttore della stessa classe con la keyword this class NuovaClasse : ClasseBase { NuovaClasse() { // Chiamata implicita a costruttore default } // Chiama costruttore successivo assegnando x=0 NuovaClasse( string s ) : this( s, 0 ) { // Chiama costruttore classe base con s NuovaClasse( string s, int x ) : base( s ) { // Dovrebbe elaborare x...

Ereditarietà (Es. C#) abstract class Payment { Payment() {…} public bool Pay() {…} public abstract bool Authorize {…} } public class CreditCard : Payment { CreditCard() {…} public override bool Authorize {…} public class Visa : CreditCard { Visa() {…} public new int Authorize {…} public class AmEx : CreditCard { AmEx() {…}

Ereditarietà a run-time public class MyApp { public static void Main() Visa vi = new Visa(); CreditCard cc; Payment pp; vi.Authorize(); cc = (CreditCard) vi; cc.Authorize(); pp = (Payment) cc; pp.Authorize(); } Visa : CreditCard custom.ctor() + base.ctor() CreditCard : Payment custom.ctor() + base.ctor() Payment (abstract) custom.ctor() + base.ctor() System.Object .ctor() IlDasm

Ereditarietà Una classe derivata può estendere o meno i membri della classe base a seconda di come è stata definita Sealed evita che la tua classe sia ereditabile Abstract forza il fatto che la classe venga ereditata perchè non è possibile utilizzarla direttamente

Ereditarietà Ogni metodo che deve essere sovrascritto (override) da una classe derivata deve essere dichiarato come virtual nella classe base La classe derivatà dovrà specificare la keyword override durante l’implementazione del metodo In .NET è consentita l’ereditarietà da una sola classe base (single inheritance) Ma è possibile implementare più intefaccie in una singola classe Tutti i membri non privati di una classe vengono ereditati di default Tutti i membri privati vengono nascosti alla classe derivata

Ereditarietà Tutti i membri protected vengono visti dalla classe base e dalla derivata La classe derivata può utilizzare la keyword base per fare riferimento ai membri della classe base Le interfaccie implementate dalla classe base vengono ereditate dalla derivata Tutti le forme di visibilità di un membro (public, private, internal, ecc.) vengono ereditati di default a meno che non siano forzati nella classe derivata Oggetti che siano compatibili (che implementano la stessa interfaccia) possono essere utilizzati al posto della classe base dove richiesto

Classi base e derivate

Ereditarietà Classi base e derivate possono implementare gli stessi metodi Normalmente viene chiamato sempre il metodo implementato nella classe derivata più vicina al tipo che si stà realmente utilizzando Se questo non esiste si passa alla classe base precedente e così via Esistono regole e vincoli di precedenza ben precisi per gestire l’ordine dell’esecuzione dei metodi nelle classi derivate e base

Ereditarietà e precedenze

Ereditarietà : Avvertenze L’uso eccessivo dell’ereditarietà può avere effetti collaterali Overhead nell’esecuzione del codice Complessità Overloading Shadowing Precedenze Spesso è da prendere in considerazione l’utilizzo di interfacce multiple

Classi e metodi sealed using System; public class CreditCard { public CreditCard() {Console.WriteLine("CreditCard:.ctor()");} public virtual bool Authorize() {Console.WriteLine("CreditCard:Authorize()");return true;} } public sealed class Visa : CreditCard { public Visa() {Console.WriteLine("Visa:.ctor()");} public override bool Authorize() {Console.WriteLine("Visa:Authorize()");return true;} public sealed class AmEx : CreditCard { public AmEx() {Console.WriteLine("Visa:.ctor()");} public override bool Authorize() {Console.WriteLine("AmEx:Authorize()");return true;} public sealed class TryToInherit : Visa { public class MyApp { public static void Main() TryToInherit tti = new TryToInherit(); CreditCard cc; cc = (CreditCard) tti; cc.Authorize();

Metodi Virtuali Se implemento un metodo in una classe base, il codice in quel metodo verrà eseguito alla chiamata del metodo in una istanza della classe base o in una istanza di una classe ereditata Se implemento un metodo in una classe derivata con lo stesso nome e formato dei parametri di uno della classe base ricevo un warning di compilazione Posso implementare un metodo nella classe derivata con nome e parametri uguali a quello nella classe base, ma implementato diversamente, solo se uso la parola chiave new Se implemento un metodo nella classe base marcato come virtual posso crearne uno uguale nella classe derivata Sarà il tipo a run-time sul quale è invocato il metodo a determinare quale implementazione è eseguita

Metodi Virtuali Una funzione virtuale viene risolta in base al tipo dell’istanza su cui viene richiamata, non al tipo di riferimento Keyword: virtual definisce una funzione virtuale in una classe base override definisce una funzione virtuale in classi derivate new nasconde un membro ereditato da una classe base Non si può usare new con override Si può usare new con virtual Utilizzato soprattutto per le problematiche di versioning

Metodi virtuali using System; public class CreditCard { public CreditCard() {Console.WriteLine("CreditCard:.ctor()");} public bool Pay() {Console.WriteLine("CreditCard:Pay()");return true;} public virtual bool Authorize() {Console.WriteLine("CreditCard:Authorize()");return true;} } public class Visa : CreditCard { public Visa() {Console.WriteLine("Visa:.ctor()");} public override bool Authorize() {Console.WriteLine("Visa:Authorize()");return true;} public class AmEx : CreditCard { public AmEx() {Console.WriteLine("Visa:.ctor()");} public override bool Authorize() {Console.WriteLine("AmEx:Authorize()");return true;} public class MyApp { public static void Main() { Visa vi = new Visa(); CreditCard cc = new CreditCard(); CreditCard vcc; vcc = (CreditCard) vi; cc.Authorize(); vcc.Authorize(); vi.Authorize(); cc.Pay(); vi.Pay(); }}

Versioning class Base // version 1 { } class Derived: Base // version 1 { public virtual void Foo() { Console.WriteLine("Derived.Foo"); }

Versioning class Base // version 2 { public virtual void Foo() { Console.WriteLine("Base.Foo"); } class Base // version 1 { } class Derived: Base // version 2a { new public virtual void Foo() { Console.WriteLine("Derived.Foo"); } class Derived: Base // version 1 { public virtual void Foo() { Console.WriteLine("Derived.Foo"); }

Versioning class Base // version 2 { public virtual void Foo() { Console.WriteLine("Base.Foo"); } class Base // version 1 { } class Derived: Base // version 2b { public override void Foo() { base.Foo(); Console.WriteLine("Derived.Foo"); } class Derived: Base // version 2a { new public virtual void Foo() { Console.WriteLine("Derived.Foo"); } class Derived: Base // version 1 { public virtual void Foo() { Console.WriteLine("Derived.Foo"); }

Interfacce Una interfaccia è un tipo astratto Definisce un contratto con l’utilizzatore del tipo che la implementa Definisce un comportamento comune a tutte le classi che la implementano Una classe deve implementare tutti i membri dichiarati in una interfaccia Un client della classe può accedere ai metodi implementati direttamente, o attraverso un casting su una variabile dichiarata di tipo uguale all’interfaccia implementata

Interfacce interface ICDPlayer { void Play(short playTrackNum); void Pause(); void Skip(short numTracks); short CurrentTrack { get; set; } } public class Device : ICDPlayer public Device() {...} public string DeviceName { get {...} set {...}} public short CurrentTrack { get {...} set {...}} public void Play(short playTrackNum) {Console.WriteLine("Now Playing");} public void Pause() {Console.WriteLine("Now Paused");} public void Skip(short numTracks) {Console.WriteLine("Skipped");} public class MainClass public static void Main() Device Device1 = new Device(); ICDPlayer CD1 = (ICDPlayer) Device1; CD1.Play(1);

Classi e interfacce Le classi vengono utilizzate per definire gli oggetti in memoria Una interfaccia definisce un “elenco” di funzioni che una classe può esporre Una classe determina quali interfacce supporta Le interfacce che una classe supporta si applicano a tutte le istanze di quella classe Un oggetto è type-compatible con l’interfaccia A se e solo se la classe dell’oggetto supporta quella interfaccia

Classi e interfacce Le interfacce vengono utilizzate per esprimere la compatibilità a livello di tipi tra classi diverse Esprimono un comportamento comune tra le classi Individuano un subset di oggetti con caratteristiche comuni Permettono di riferirsi ad un oggetto attraverso una interfaccia supportata Permettono un reale polimorfismo nel CLR Vincolano il tipo di oggetto al quale una variabile/parametro/field può fare riferimento

Classi astratte e interfacce Una classe astratta denota normalmente una implementazione “parziale” o non completa di un determinata funzionalità Una classe astratta non può essere instanziata direttamente, ma deve essere ereditata da una classe derivata Una classe astratta può contenere sia metodi realmente implementati che altri solamente definiti Saranno implementati nelle classi derivate

Classi astratte e interfacce Una classe astratta solitamente incapsula funzionalita comuni a tutte le classi derivate Una interfaccia definisce un comportamento, che dovrà essere implementato dalla classe che la implementa Sia le classi astratte che le interfacce sono molto utili per realizzare anche il polimorfismo Es. scrivere metodi che accettano come parametro oggetti di tipo diverso, o oggetti che implementano le stesse interfacce/comportamenti

Classi e interfacce public class AmericanPerson{} public class CanadianPerson{} public class Car {} void OperateAndTransfuse(Object patient) { // what if patient is a Car? } public interface IPatient {} public class AmericanPerson : IPatient {} public class CanadianPerson : IPatient {} void OperateAndTransfuse(IPatient patient) // accetps only a person object

Implementazione di interfacce public class MyClassName : MyItf1, MyItf2, MyItf3 { // member definitions go here } Lista delle interfaccie supportate

Interfacce Multiple public interface IPatient { } public interface IBillee { } public class AmericanPatient : IPatient, IBillee {} public class CanadianPatient : IPatient {} public class CanadianGovernment : IBillee {} // American patient acceptable for both parameters void OperateAndTransfuseBlood(IPatient patient, IBillee moneySrc) { }

Interfaccie Multiple

Interface discovery È possibile determinare se un tipo implementa una certa interfaccia C# prevede tre possibilità casting (e relativa eccezione in caso di non supporto) AS IS public interface IPatient{} public interface IBillee{} public interface ISelfFoundedPatient : IPatient,IBillee {} public class InsuredPatient : IPatient,IBillee {} public class WhealtyPatient : ISelfFoundedPatient {} void OperateAndTransfuseBlood(ISelfFoundedPatient patient) { IBillee moneysrc = (IBillee)patient; ISelfFoundedPatient sfp = patient as ISelfFoundedPatient; if (sfp!=null) Debug.Assert (patient is IBillee) }

Interfacce e metodi All’interno di una classe è possibile implementare i metodi di una interfaccia in due modi Come metodi publici Come metodi dell’interfaccia Sono accessibili solo attraverso un riferimento all’interfaccia stessa Vengono nascosti dalla “firma” publica della classe public interface IPatient { void Transfuse(); void Operate(); } public class AmericanPatient : IPatient public void Transfuse{}; public void IPatient.Operate{}; void Main() AmericanPatient ap = new AmericanPatient(); ap.Trasfuse(); // legal ap.Operate(); // illegal IPatient patient = ap; patient.Operate(); // legal, calls ApericanPatient.IPatient.Operate

Interfacce e ereditarietà Una classe può implementare interfacce base o derivate da altre interfaccie Oggetti che implementano le interfacce derivate sono type-compatible con ognuna delle interfacce base dalle quali derivano public interface IPatient{} public interface IBillee{} public interface ISelfFoundedPatient : IPatient,IBillee {} public class InsuredPatient : IPatient,IBillee {} public class WhealtyPatient : ISelfFoundedPatient {} void OperateAndTransfuseBlood(ISelfFoundedPatient patient) { // accepts only WhealtyPatient objects }

C# vs. VB.NET Le keyword nei due linguaggi Tipologia C# VB.NET Classe astratta abstract MustInherit Classe non ereditabile sealed NotInheritable Ereditarietà Derivata : Base Derivata : Inherits Base Impl. Interfacce Classe : Interfaccia Implements Interfaccia Modificatori di accesso public Public internal Friend protected Protected private Private virtual N/A

Polimorfismo using System; public class CreditCard { public CreditCard() {Console.WriteLine("CreditCard:.ctor()");} public virtual bool Authorize() {Console.WriteLine("CreditCard:Authorize()");return true;} } public class Visa : CreditCard { public Visa() {Console.WriteLine("Visa:.ctor()");} public override bool Authorize() {Console.WriteLine("Visa:Authorize()");return true;} public class AmEx : CreditCard { public AmEx() {Console.WriteLine("Visa:.ctor()");} {Console.WriteLine("AmEx:Authorize()");return true;}

Polimorfismo public class MyApp { public static void Main() Visa myVisa = new Visa(); AmEx myAmEx = new AmEx(); DoPayment(myVisa); DoPayment(myAmEx); } public bool DoPayment(CreditCard mycard) { // scrivo un metodo assolutamente generico… if (mycard.Authorize()) // Payment ok

Considerazioni finali Il .NET Framework è un ambiente di programmazione completamente orientato agli oggetti Comprendere e familiarizzare con questo paradigma di progettazione e sviluppo del codice permette di aumentare la manutenibilità, modularità e leggibilità del codice, anche in applicazioni di grandi dimensioni Le librerie del .NET Framework sono un esempio molto interessante di realizzazione OOP reale L’utilizzo delle interfacce solitamente è sottovalutato dagli sviluppatori Oltre a consentire lo sviluppo di codice polimorfico, spesso è una alternativa interessante alla ereditarietà multipla Attenzione alle controindicazioni che un utilizzo eccessivo dell’ereditarietà può creare nelle nostre applicazioni

Link utili MSDN Academic Allicance MSDN Studenti MSDN Online GotDotNET http://www.msdnaa.net MSDN Studenti http://www.microsoft.com/italy/msdn/studenti MSDN Online http://msdn.microsoft.com GotDotNET http://www.gotdotnet.com ASP.NET http://www.asp.net Windows Forms http://www.windowsforms.net DevLeap http://www.devleap.it UgiDotNet http://www.ugidotnet.org

© 2003-2004 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.