似乎普遍认为使用受保护的数据成员是一个坏主意。我想知道在特定情况下会有什么好的选择。
以下面的名为 CModule 的类为例,它代表一个音频模块(Amiga 风格的跟踪器音乐)。存在许多不同的模块格式,但它们之间的唯一区别在于文件格式(加载)和音频效果处理。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() 函数需要全部填充它们。这被认为是不好的,因为如果有人从派生类派生类,它可能会破坏封装。解决这个问题的正确方法是什么?我已经发现使用 getter/setter 也被认为是不好的。
非常感谢任何花时间阅读本文的人:)