0

我正在制作一个用于控制网络数据包的小系统。我有以下课程:

  • 数据包(具有检索和设置数据的功能)
  • AuthPackets(继承数据包类)
  • AuthSend(AuthPackets 的发送函数)
  • AuthRecv(AuthPackets 的接收函数)

因此,据我了解,AuthSend 和 AuthRecv 是 AuthPackets 的组合,但它们都需要 Packets 类的功能。

所以代码看起来像这样:

class Stream {
private:
    int position;
    void* packet;
    void* get_streampointer();
    public:
        void Skip(int bytes);
        void NewPos(int pos);

        void SetShort(short Data);
        void SetInt(int Data);
        void SetStringRef(StringRef* stringref);

        short GetShort();
        int   GetInt();
        void GetStringRef(StringRef* storedata);
};

class Packets : public Stream {
public:
    void PacketEncrypt();
    void PacketDecrypt();
    short Size;
    short Type;
};

class AuthPackets: public Packets {
    AuthSend send;
    AuthRecv recv;
    bool Protocol(Player* player);
};

class AuthSend: public Packets {
public:
    void SecureToken(short SecurCode);
    void EncSecureToken(short SecurCode);
};

class AuthRecv: public Packets {
public:
    bool SecurCode(Player* player);
};

问题是,如果 AuthSend 和 AuthRecv 是 AuthPackets 类的一部分,为什么它们必须继承 Packets?(已经继承了数据包)。

此外,如果我从 AuthSend 和 AuthRecv 继承 AuthPackets,我将失去调用函数的糖语法,如下所示:

authpackets.send.SecureToken

所以主要问题是为什么我的设计有缺陷?谢谢

4

2 回答 2

0

好吧,我将尝试在这里解决(我相信是)您的问题;如果您使用公共的任何东西,它们确实需要从数据包继承:在 AuthSend 和 AuthRecv 的数据包中。它们不是 AuthPackets 的一部分,它们只是 AuthPackets 中的对象。无论如何,您不会影响您的 AuthSend 和 AuthRecv 定义,并在另一个具有公共:数据包的类中声明一个对象。如果您想使用 Packets 中公开的内容,我不明白这里的一切对我来说都很好时,您的意思是“设计上的缺陷”。如果我错过了,请在此处提供有关您的问题的更多信息。

于 2012-09-16T23:39:42.580 回答
0

AuthSend 和 AuthRecv 应该继承自一个可能称为 Packet 的抽象基类(注意:单数)。为什么您的 AuthPackets 类包含每种类型的成员,而不仅仅是通用功能?如果您需要一个类来保留身份验证数据包本身,它不应该从 Packet 继承。

要获得完整的答案,需要更多关于您尝试做什么的信息。

于 2012-09-16T23:09:03.973 回答