Dopo una breve discussione in i commenti qui sono giunto a chiedermi se una baseclass come Animal
nel tradizionale esempio OOP dovrebbe essere contrassegnato come astratto o no.
Personalmente credo che dovrebbe: non esiste un "animale", è semplicemente un termine che raggruppa certi sottotipi in base a ciò che sono. Qualsiasi istanza di un "animale" dovrebbe essere un sottotipo, un esempio concreto.
Il commento che seguì su questo fu
There most certainly is such a thing as an Animal. Or would you insist that Dog be broken down into Affenpinscher, IrishWolfhound, SiberianHusky, EnglishSetter, and 600 other breeds?
che è un'osservazione giusta ma diversa dalla situazione originale in cui la gerarchia era
EnoncisonosottoclassidiDog
inprimoluogo.Secifossestatoallorasì,Dog
dovrebbeessereastrattoperchél'alberoincludefogliepiùspecificheperqueltipospecifico.
Possosolosupporrecheilmotivopercuinonlofaresticomesottotipospecificoèquandosemplicementenonlosai.Vorreiinveceaggiungereun'implementazione"predefinita" di un cane per tener conto di ciò in modo da poter mantenere la classe Dog
astratta in modo tale che non ci sia alcuna ambiguità possibile: sei costretto a creare un cane specifico o ad indicare che tu non conosco il tipo.
Inoltre ti permette anche di creare metodi di abstract
che ogni cane dovrebbe implementare per se stesso perché sono specifici per i cani. Usando una classe non astratta non puoi farlo e dovrai ricordarti di sovrascrivere ogni metodo nelle sottoclassi.
Nell'alberodicuisopracreoDog
,Mammal
eAnimal
abstracteconsentoaglialtridiessereistanziati.
Ladomandasiriduceaquesto:dovrestiessereingradodiistanziareunaclassecheesisteperindicareunasottospecieodovrestirinviarelacreazionediuntaleoggetto"generale" a un sottotipo?