morellik ha scritto:
non riesco a capire quando usare classi astratte, interfacce, annotazioni.
Una classe la si dichiara
astratta quando NON ha senso poterla istanziare. Se ne possono fare tanti di esempi, uno classico: gerarchia di classi per rappresentare le figure tridimensionali, ovvero classe Solido con sotto classi es. Sfera, Cubo, ecc.... Ha senso poter istanziare Solido? Solido di che cosa?? Appunto, non ha granché senso, un "solido" è un concetto astratto. Pertanto la classe Solido è una ottima candidata per essere marcata
abstract.
Una interfaccia la devi vedere come se fosse una classe astratta al 100%, ovvero nulla di concreto, tutto completamente astratto. E siccome le interfacce si possono implementare (e più di una) in qualsiasi classe a qualunque livello in una gerarchia, vengono tipicamente usate per rappresentare un "contratto" tra almeno due entità. E spesso per rappresentare la capacità di "sapere fare qualcosa" (es. Runn
able, Compar
able, Iter
able ecc...).
Le annotazioni servono per applicare dei "metadati" agli elementi del programma, cioè a classi, metodi, variabili, parametri, ecc... con lo scopo di fornire configurazioni, informazioni o direttive specifiche che possono essere usate dal compilatore, da librerie/framework o da tools di terze parti.