Recentemente ho visto una domanda di progettazione OO su alcuni forum e ho iniziato a pensare di usare RTTI. Tuttavia questo deve essere un cattivo design, ma non riesco a pensare a un'alternativa. Ecco la semplice domanda:evitare RTTI in OO design
creare un programma C++ per il seguente scenario utilizzando concetti OO -
Il mio cane, di nome Buddy vive nel cortile di casa. Abbaia di notte quando vede un gatto o uno scoiattolo che è venuto a visitare. Se vede una rana e ha fame, la mangia. Se vede una rana e non ha fame, gioca con lui. Se ha già mangiato 2 rane e ha ancora fame, lo lascerà andare. Se vede un coyote, cerca aiuto. A volte il suo amico Spot si ferma e si rincorrono. Se vede altri animali, lo guarda semplicemente. Mi aspetto che tu abbia una classe di animali e una classe di cani, cani, scoiattoli, coyote che erediti dalla classe degli animali.
ho iniziato a pensare di avere un metodo See() nella classe cane che prende un argomento di animali e poi controlla il tipo effettivo dell'oggetto (rana, gatto, ecc) e prende l'azione necessaria - play, caccia, ecc a seconda del tipo effettivo. Tuttavia ciò richiederebbe RTTI che deve essere una cattiva progettazione. Qualcuno può suggerire un design migliore che eviti RTTI e segnala anche l'errore nel mio modo di pensare?
Penso che questa domanda appartiene a programmers.stackexchange.com. –
Una nota ** molto ** importante è RTTI, in quanto gestita * dal compilatore *, non è l'unico modo per un oggetto di identificarsi. Potresti anche avere un metodo 'enum AnimalTypes' e' virtual Animal :: GetType() ', o un metodo' Uuid Unknown :: GetClass() '(un COM 'IUnknown :: QueryInterface') o anche un problema specifico 'Animale :: IsScarierThan (Animal * me)'. Esistono diversi modi per utilizzare la progettazione orientata agli oggetti per ottenere informazioni sul tipo di runtime, senza utilizzare RTTI come tale. – ssube
* che è venuto a visitare * -> vuoi dire che il gatto e lo scoiattolo sono * visitatori *;)? –