Lo so... è un tema che ogni tanto ripropongo... ma visto che continuo ad avere conversazioni con persone che criticano la scelta di C# di non avere i metodi virtual di default (a differenza di Java) ho deciso di parlarne di nuovo, cercando di estendere il discorso...
Ci si lamenta del fatto che in Java è facilissimo estendere una libreria progettata da altri, mentre in C# no.
Riporto di nuovo la splendida intervista ad Anders Hejlsberg dove si spiega la motivazione di questa scelta, e anche il post How Virtual Methods Work dove si spiega il funzionamento del virtual.
Ma ricordate... mettere un metodo virtual o meno è una scelta di DESIGN. Se qualcuno la fa sbagliata... non dite in Java questo problema non c'è... perchè in Java c'è il problema opposto, quello dove TUTTO è virtual... e quindi tutto può essere ridefinito senza particolari scelte o senza pensarci troppo, e questo è causa di problemi subdoli e difficilmente individuabili mentre si scrive il codice. Senza poi parlare delle performance...
E senza poi condiderare questo:
I can demonstrate to you a very real world versioning problem, one that indeed we see now from experience with Java. Whenever they ship a new version of the Java class libraries, breakage occurs. Whenever they introduce a new method in a base class, if someone in a derived class had a method of that same name, that method is now an override—except if it has a different return type, it no longer compiles. The problem is that Java, and also C++, does not capture the intent of the programmer with respect to virtual.
Estendendo il discorso, durante una festa di Natale di quest'anno parlavo con una persona "mooolto" competente del fatto che a volte ci si mette a discutere di tante cose ad alto livello, SOA, architetture, Software Factories, Domain Model, ORM, etc.. ma poi ci si rende conto che spesso alcune cose vengono date troppo per scontate.
Chi ritiene di conoscere bene i delegate? Chi ha "ben" chiaro virtual, overrides e new? Ci sa bene come il garbage collector gestisce gli oggetti piccoli e quelli grandi? Generazioni non è solo un film della saga di Star Trek.
Ogni tanto riprendo in mano il Ritcher, MSDN Magazine e altre fonti, e mi faccio una bella ripassata di alcuni concetti, e, di solito, con il senno di poi e l'esperienza accumulata, ogni volta scopro qualcosa di nuovo o mi si chiarisce qualche concetto che prima era rimasto nebuloso...
Mi è piaciuto molto il post oggi di Raf, che ha riportato un po' di tecnico all'interno del blog di UGI, dopo i bagordi post-capodanno, Sete di handle e le applicazioni che non si aprono più. Mi chiedo quanti ci hanno ragionato almeno un po', soprattutto chi sviluppa applicazioni Windows.
Mi chiedo quanti hanno seguito il consiglio di Roberto (Forse non tutti sanno che...) e hanno scaricato il bellissimo webcast di Janky dal titolo impronunciabile. E pensare che quando Janky si è offerto di tenerlo non immaginava ancora a cosa sarebbe andato incontro.
Certo, poi c'è il libro Framework Design Guidelines : Conventions, Idioms, and Patterns for Reusable .NET Libraries che è un MUST HAVE, da leggere almeno una volta.
Senza parlare dell'italianissimo libro di Francesco e Giuseppe, che pure se ad un livello differente, introduce tanti e tali concetti nella normalità del lavoro quotidiano che andrebbe letto sicuramente più di una volta con attenzione, per scegliere le regole che conviene applicare sempre, e quelle che è bene applicare...
Boh... spero di non aver preso la tangente. Ma ricordatevi... Virtual, Override, i Delegate, etc... etc... sono tutte scelte di design che facciamo, non diamo la colpa al linguaggio se qualcuno le ha fatte nel modo sbagliato...