web-dev-qa-db-ja.com

基本クラスで保護メンバーを使用するか、派生クラスでプライベートメンバーを使用する必要がありますか?

理由は、OO)の原則/ガイドラインに違反している場合から、パブリックAPIの一部として保護されていると見なす場合までさまざまです。

次に、いくつかの派生クラスに同じメンバーがある場合はどうすればよいですか?それらを基本クラスで宣言して継承する必要がありますか?または、派生クラスで複数回宣言する必要がありますか?

たとえば、クラスWarriorとクラスWizardの両方にhp、atk、defなどのメンバーがあり、基本クラスPlayerから派生しています。クラスWarriorには独自のメンバーfuryがあり、クラスWizardは独自のメンバーマナを持っています。

したほうがいい:

  1. クラスPlayerでhp、atk、defを保護されていると宣言し、クラスWarrior、マナでWizardのマナを怒りと宣言しますか?
  2. クラスwarriorとクラスWizard privateとしてhp、atk、def、fury(Warriorのみ)、mana(Wizardのみ)を宣言しますか?

どちらがより良い実践であり、なぜですか?

PS:この質問は主観的な意見に基づいていると言われましたが、それでも、いつ実装するかを人々がどのように決定するかについて知りたいと思います。ありがとうございます。

5
adayoegi

あなたは間違った方法で質問をしています。

正しい質問は、「私の基本クラスは、それにちなんで名付けられたものを実装していますか?」です。

プレイヤーはHPを持っていますか?その場合、HPは派生クラスではなくプレーヤークラスのメンバーである必要があります。そうでない場合、プレーヤーはプレーヤーを実装しないためです。

このメンバーを保護する必要がありますか?プライベートにして、プレーヤークラスに不変式の適用を任せてみませんか(たとえば、最小値を超えないようにしたり、許可された最大値を超えないようにしたり、0に達した場合に死を引き起こしたりします)。繰り返しますが、そうでない場合、Playerは実際にはプレーヤーを実装していませんが、「ここでは、プレーヤーにとって便利なものをいくつか用意しています」。

8
Sebastian Redl

セバスチャンはすでに、クラスのデザインについての彼のアドバイスで頭を釘付けにしました。

完全を期すために、ここにいくつかの非常に重要な追加ポイントがあります。

  • 基本クラスで保護またはプライベートのデータメンバーを定義して、後で派生クラスで再定義しないでください。これは、同じ名前の別のメンバーを定義し、ひどい混乱を招くだけです( オンラインデモ )。
  • セバスチャンによって提案されたクリーンで規律のあるプライベートなアプローチで作業しない場合は、少なくとも自分自身と一貫している必要があります。派生クラス(たとえば、Warrior)でデータを定義する場合は、保護することをお勧めしますプライベートよりも、基本クラスで想定したとおりです。これは、後でWarriorをBotWarriorおよびAlienWarriorにさらに派生させることにした場合に役立ちます。
2
Christophe