# Parte IV dell'intervista con Anders Hejlisberg

<datetime class="hidden">2004-05-12T00:00</datetime>

<!-- category -- mostlylucidcouk, Imported, C#, Software Development -->
Collegato agli altri 3, [Ecco la parte 4](http://www.artima.com/intv/nonvirtualP.html) , roba molto interessante sui metodi virtuali in C#
Questa è roba davvero interessante (beh, penso che lo sia!)... ecco una sezione su 'contratti' e metodi virtuali... il bit Java è SO true!

Bill Venners: Cosa intendi per contratto in entrata e in uscita?

Anders Hejlsberg: Il contratto in arrivo è quello che uso quando chiamo un metodo. Mi permette di ragionare su ciò che sono tenuto a fare prima di chiamare il metodo e su quello che è successo dopo il ritorno del metodo. Il contratto in uscita è quello che uso quando override un metodo. Se si guarda alla maggior parte delle API sono in realtà molto male a documentare ciò che si suppone di fare quando si override un metodo virtuale: Quali sono le invarianti prima di essere chiamati? Che cosa dovrebbe essere vero dopo? Quali metodi non si può chiamare dalla vostra implementazione? E così via. Penso che sia molto pericoloso dire che per impostazione predefinita tutti i metodi hanno aspetti sia in entrata che in uscita. È pericoloso fidarsi di tutti di scrivere una buona documentazione su quando overridere e quali sono gli invarianti quando sovrascrive.

Posso dimostrare a voi un problema di versione del mondo molto reale, uno che effettivamente vediamo ora dall'esperienza con Java. Ogni volta che spediscono una nuova versione delle librerie di classe Java, si verifica rottura. Ogni volta che introducono un nuovo metodo in una classe base, se qualcuno in una classe derivata aveva un metodo dello stesso nome, questo metodo è ora un override, tranne se ha un diverso tipo di ritorno, non compila più. Il problema è che Java, e anche C++, non cattura l'intento del programmatore rispetto al virtuale.