0

保護されたデータ メンバーを使用することは悪い考えであるというのが一般的な意見のようです。特定のケースでは、どのような代替案が良いのか疑問に思っています。

オーディオ モジュール (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() 関数がそれらすべてを満たす必要があるため、ほとんどすべてのデータ メンバーが保護されます。誰かが派生クラスからクラスを派生させた場合、カプセル化が壊れる可能性があるため、これは悪いと見なされます。この問題を解決する適切な方法は何でしょうか? ゲッター/セッターの使用も悪いと考えられていることはすでにわかっています。

これを読むために時間を割いてくれた人に感謝します:)

4

1 に答える 1

0

ソリューションでプライベートを使用できない場合は、保護されたデータ メンバーを使用しても問題はありませんが、パブリック データ メンバーを使用することはほとんど良い考えではありません (ただし、場合によってはそうなる場合もあります)。

この場合、おそらくベクトルをプライベートにしますが、単純にゲッター メソッドとセッター メソッドを作成します。次のようなもの:

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;

        void AddInstrument(CInstrument instrument)
        {
            Instruments.push_back(instrument);
        }

        Instrument GetInstrument(int index)
        {
            return Instruments[index];
        }

        int InstrumentCount()
        {
            return Instruments.size();
        }
private:
        //Song information/data.
        vector<CInstrument> Instruments;
        vector<CPattern> Patterns;
        //And much, MUCH more...
};

これはインストゥルメントだけのスタートです。パターンでも同様のアプローチを取る必要があります。別の方法として、ベクトルを返すこともできますが、これはもう少しカプセル化されています。

また、私は頭の中でこれを行っており、タイプミスに対してテストしていませんが、アイデアが伝わることを願っています.

于 2012-04-08T23:40:48.743 に答える