Un animale dovrebbe essere astratto o consentire l'istanziazione di rappresentare un'istanza "generale"? [chiuso]

2

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

EnoncisonosottoclassidiDoginprimoluogo.Secifossestatoallorasì,Dogdovrebbeessereastrattoperché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,MammaleAnimalabstracteconsentoaglialtridiessereistanziati.

Ladomandasiriduceaquesto:dovrestiessereingradodiistanziareunaclassecheesisteperindicareunasottospecieodovrestirinviarelacreazionediuntaleoggetto"generale" a un sottotipo?

    
posta Jeroen Vannevel 03.08.2014 - 15:55
fonte

2 risposte

4

Pensa allo scopo della tua logica aziendale. Se la tua applicazione registra suoni prodotti dai tuoi animali domestici, potresti voler fare la differenza tra cani e gatti; altrimenti, quando chiami myCat.Bark , qualcosa potrebbe andare storto. D'altra parte, un cane da lupo irlandese abbaia, e anche un husky siberiano abbaia, rendendo irrilevante la questa distinzione.

In questo caso, Dog e Cat sarebbero classi effettive e Animal sarà astratto.

D'altra parte, se la tua applicazione gestisce razze diverse di cani e gatti, la differenza tra un husky siberiano e un setter inglese diventa rilevante.

Ora, Affenpinscher e IrishWolfhound saranno le classi effettive, mentre Animal o Dog sarebbero astratte.

Il commento:

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?

non prende in considerazione l'ambito. Quando tutto ciò che voglio è registrare i suoni di cani e gatti, dal punto di vista del business, non esiste una cosa come un'istanza della classe Animal : è un cane o un gatto. Se è un cane, la sua razza non ha importanza; può essere una proprietà di Dog class, ma certamente non fa parte della gerarchia di classi.

    
risposta data 03.08.2014 - 16:11
fonte
2

A meno che ogni sottotipo non aggiunga un comportamento distinto, le differenze si presenteranno come attributi delle varie istanze, ad esempio breed , color , weight , ecc. Dubito che dovrai modellare un TwentyEightPoundBlackIrishWolfhound come sottoclasse.

Se stai costruendo un gioco di venti domande (è un animale, un vegetale o un minerale?) una classe concreta Animal potrebbe avere un senso.

    
risposta data 03.08.2014 - 22:14
fonte

Leggi altre domande sui tag