Dovremmo utilizzare un membro protetto nella classe base o un membro privato nella classe derivata?

5

Le ragioni possono variare dal principio di rottura / linee guida di OO a considerare protetto come parte dell'API pubblica.

Quindi, cosa dovremmo fare se alcune classi derivate hanno gli stessi membri? Dovremmo dichiararli nella classe base ed ereditarli? O dovremmo dichiararli più volte nelle classi derivate?

Ad esempio, la classe Warrior e la classe Wizard hanno entrambi membri come hp, atk, def e sono derivati dalla classe base Player. Il guerriero di classe ha il suo membro furore, mentre il mago di classe ha il suo mana membro.

Dovrei:

  1. dichiarare hp, atk, def in class Player come protetto e dichiarare furia come privato in classe Warrior, mana in Wizard?
  2. dichiara hp, atk, def, fury (solo Warrior), mana (solo Wizard) in classe Warrior e class Wizard come privato?

Qual è la migliore pratica e perché?

PS: mi è stato detto che questa domanda è basata sull'opinione primaria, ma mi piacerebbe comunque sapere come le persone decidono quando implementarne una, grazie.

    
posta adayoegi 16.12.2017 - 03:35
fonte

2 risposte

8

Stai facendo la domanda nel modo sbagliato.

La domanda giusta da porre è: "La mia classe base implementa ciò che prende il nome?"

Un giocatore ha HP? Quindi HP dovrebbe essere un membro della classe giocatore, non delle classi derivate, perché altrimenti, il giocatore non sta implementando un giocatore.

Questo membro dovrebbe essere protetto? Perché non renderlo privato e mettere la classe Player in carica per far rispettare gli invarianti su di esso (come non permettergli di scendere oltre un minimo, o superare il massimo consentito o innescare la morte se colpisce 0)? Di nuovo, se non lo fai, allora il giocatore non implementa realmente un giocatore, ma piuttosto un "ecco alcune cose che potrebbero essere utili a un giocatore".

    
risposta data 16.12.2017 - 09:57
fonte
2

Sebastian ha già colpito il chiodo sulla testa con i suoi consigli sul design della classe.

Per completezza, ecco alcuni punti aggiuntivi molto importanti:

  • non si dovrebbe definire un membro dei dati protetto o privato nella classe base e successivamente ridefinirlo nella classe derivata: questo definirà semplicemente un altro membro con lo stesso nome e creerà una terribile confusione (online demo ).
  • se non lavori con l'approccio privato pulito e disciplinato suggerito da Sebastian, allora dovresti essere almeno coerente con te stesso: se definisci alcuni dati nella classe derivata (ad esempio Warrior ), dovresti preferire protetto su privato, esattamente come hai previsto per la classe base. Questo sarebbe utile, se in seguito decidessi di derivare ulteriormente Warrior in BotWarrior e AlienWarrior .
risposta data 16.12.2017 - 15:23
fonte

Leggi altre domande sui tag