PDA

Visualizza la versione completa : [C++] Classe astratta


starcraftworld
09-07-2011, 13:42
Quando creo una classe astratta vale sempre la regola di mettere l'interfaccia in un file .h e l'implementazione in un file cpp?
I metodi che sono identici per tutte le classi derivate mi conviene definirli e implementarli direttamente nella classe astratta?
Riguardo i metodi comuni alle classi derivate ma implementati in modo diverso nelle varie classi, cosa mi conviene fare nella classe astratta?

Dark867
09-07-2011, 15:58
Le regole non sono assolute ma dipendono dal programmatore, cmq in linea generale si mette l'interfaccia di una classe nel file .h per separare l'interfaccia dall'implementazione e quindi rendere la vita più facile a chi andrà ad usare quella classe (a cui importa solo dell'interfaccia).
Se la tua classe è puramente astratta, oppure i metodi che implementi sono pochi e piccoli potresti voler mettere tutto in un unico file, altrimenti spezzi come al solito.
E' ovvio che i metodi in comune li devi implementare nella classe astratta: metti che vuoi in futuro modificarli leggermente...è molto più comodo modificare soltanto la classe astratta piuttosto che modificare tutte le 5-6 classi derivate giusto?
Per i metodi che cambiano...nella classe astratta non devi fare niente ti pare?

starcraftworld
09-07-2011, 16:14
Se tutte le classi derivate ereditano il metodo x() ma ciascuna lo implementa in modo diverso questo metodo non deve comparire nell'interfaccia della classe astratta come metodo astratto?

Dark867
09-07-2011, 16:31
Si, al 99% dei casi è così.

starcraftworld
09-07-2011, 16:55
Quando si verifica il restante 1%? :D
Precisamente cosa cambia tra definirla anche nell'interfaccia della classe astratta o solo nella classe derivata?

Dark867
09-07-2011, 17:03
http://it.wikipedia.org/wiki/Classe_astratta

starcraftworld
09-07-2011, 20:24
Quindi se per esempio ho un oggetto PezzoDegliScacchi...
l'attributo Colore lo metto nella classe PezzoDegliScacchi perchè ce l'hanno tutte le classi derivate Cavallo, Pedone ecc...
il metodo getColore oppure setColore è comune a tutte le classi derivate quindi anche questo lo metto nella classe PezzoDegliScacchi e lo implemento, giusto?
Invece il metodo mossa, presente in tutte le classi derivate ma implementato in maniera diversa in ogni classe lo metto nell'interfaccia della classe PezzoDegliScacchi ma come metodo virtuale, quindi senza implementarlo?

Dark867
10-07-2011, 10:38
Bravissimo! In questo caso è anche una questione logica: "pezzo degli scacchi" è un nome perfettamente astratto e non ha proprio il concetto di "muovere", lo acquista quando diventa un pezzo ben definito.

starcraftworld
10-07-2011, 17:50
Ma tra mettere l'interfaccia di mossa in PezzoDegliScacchi e non metterla cosa cambia? Cioè a cosa serve che in PezzoDegliScacchi ci sia questo metodo astratto? Non è equivalente definirlo direttamente nelle varie classi Pedone, Cavallo, ecc?

Dark867
10-07-2011, 19:02
...ma allora fai le cose senza sapere xke le fai..-.-
Le classi astratte sono alla base del polimorfismo...cerca un po' su google questa parola e capirai.

Loading