保護されたデータ メンバーを使用することは悪い考えであるというのが一般的な意見のようです。特定のケースでは、どのような代替案が良いのか疑問に思っています。
オーディオ モジュール (Amiga スタイルのトラッカー音楽) を表す CModule と呼ばれる次のクラスを取り上げます。多くの異なるモジュール形式が存在しますが、それらの唯一の違いは、ファイル形式 (読み込み) とオーディオ エフェクトの処理です。CModule はすべての共通機能を保持し、派生クラスは特定のフォーマットごとに読み込みと効果を実装します。
class CModule
{
public:
CModule(string Filename); //Song file name to load.
//Common methods...
void Play();
void Stop(); //Etc...
protected:
//Derived class should implement these with format specific code.
//Base class code calls these when needed.
virtual void Load()=0;
virtual void Effects()=0;
//Song information/data.
vector<CInstrument> Instruments;
vector<CPattern> Patterns;
//And much, MUCH more...
};
派生クラスの Load() 関数がそれらすべてを満たす必要があるため、ほとんどすべてのデータ メンバーが保護されます。誰かが派生クラスからクラスを派生させた場合、カプセル化が壊れる可能性があるため、これは悪いと見なされます。この問題を解決する適切な方法は何でしょうか? ゲッター/セッターの使用も悪いと考えられていることはすでにわかっています。
これを読むために時間を割いてくれた人に感謝します:)