1

これは実際のプログラミングに関する質問ではなく、プログラムの一部を構成する方法についてアドバイスが必要なだけです。

プログラムは、クライアント部分とサーバー部分に分かれています。どちらも、基本クラスを含む特定のコードを共有しています。これが私が問題を抱えているコードの表現です:

共有クラス:

class BaseEntity
{
public:
    virtual void EmitSound(std::string snd) {}
    virtual bool IsPlayer() {return false;}
};

class BasePlayer
    : public BaseEntity
{
public:
    bool IsPlayer() {return true;}
}

サーバー側クラス:

class Entity
    : public BaseEntity
{
public:
    void EmitSound(std::string snd)
    {
        // Serverside implementation
    }
}

class Player
    : public Entity,BasePlayer
{
public:
    void Kick() {}
}

クライアント側のクラス:

class CEntity
    : public BaseEntity
{
public:
    void EmitSound(std::string snd)
    {
        // Clientside implementation
    }
};

class CPlayer
    : public CEntity,BasePlayer
{
public:
    void SetFOV() {}
}

(方法は一例です)

クラス 'Player' は、'Entity' と 'BasePlayer' の両方からすべてのメンバーを継承する必要があります。ただし、どちらも同じ親クラス (BaseEntity) を持っているため、これは機能しません。

もちろん、「BasePlayer」から継承を削除することもできますが、そうすると、2 つの「IsPlayer」関数が作成され、それぞれが異なるものを返すことになります。

すべてのメンバーを「BasePlayer」から「Player」と「CPlayer」にそれぞれ移動することもできますが、これは回避したい冗長性につながり、いずれかのオブジェクトに対して単一のポインターを使用できなくなります。すべての共有メソッドへのアクセスを維持しながらクラス。

これらの解決策はどちらも好きではありませんが、他に何も考えられません。この問題に対する最適な解決策はありますか?

4

1 に答える 1

1

あなたの特定の問題を解決すると私が思う最も簡単な解決策は、クラスBasePlayerがクラスBaseEntityから継承されないようにすることです。

クラス Player は、クラス BaseEntity を継承するクラス Entity を継承するため、BaseEntity クラスの特性になり、クラス CPlayer は、クラス BaseEntity を継承するクラス CEntity を継承するため、BaseEntity クラスの特性になります。

于 2013-06-01T16:13:22.583 に答える