Ho una classe astratta Dog
e più sottoclassi ( Beagle
, Labrador
, Bulldog
...) estendendolo. Ho un DogHouse
che può memorizzare Dog
.
Il mio problema è che quando metto ad esempio un Beagle
in un DogHouse
come doghouse.addDog(beagle)
e poi lo tolgo con doghouse.getDog()
, questo metodo mi dà il beagle come Dog
, ma voglio per recuperare il mio Beagle
.
DogHouse
ha molti più metodi, tutti mi danno Dogs
, ma lavoro con cani specifici nella mia applicazione. Significa che devo sempre abbattere?
Aggiornamento:
Sto usando TypeScript e posso modificare qualsiasi parte del codice in modo che le mie opzioni siano praticamente infinite. Quello che non capisco:
Immagina di avere due scuole di cani. Sapendo che le diverse razze di cani sono capaci di cose molto diverse e hanno bisogno di cure e allenamenti diversi, la scuola di cane 1 è specializzata in Greyhound
s, mentre l'altra è allenamento diciamo solo Bulldog
s.
C'è un'azienda che vende DogHouse
s. Dicono che il loro prodotto è compatibile con qualsiasi tipo di Dog
, quindi entrambe le scuole di cani decidono di acquistare da loro.
Un allenatore alla scuola di cani 1 dice a un Greyhound di correre molto velocemente: greyhound.runVeryFast();
- qualcosa che solo i greyhound possono fare. Funziona.
Quindi, manda il levriero in una DogHouse: doghouse.addDog(greyhound);
- che funziona anche.
Dopo che il cane ha potuto riposare abbastanza, lei lo chiama e gli dice di correre di nuovo molto velocemente: doghouse.getDog().runVeryFast();
- Non funziona.
Si rivolge alla società che vende il DogHouse
s per lamentarsi di quale stupida casa hanno costruito che un cane dimentica in quale razza appartiene. "Perché devo dire al cane (il cast di lui) che è un Greyhound
ogni volta che esce da casa sua?"
La società risponde "Scusa signora, forse possiamo costruire una nuova casa usando i farmaci generici." Ma poi la signora risponde: "E accetterà allora anche Cat
s"? Voglio solo una casa per Dog
s. "
Quindi la mia domanda è: come costruire un DogHouse
corretto?