关于班级组成

About class composition

本文关键字:于班级      更新时间:2023-10-16

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

  • 数据包(具有检索和设置数据的功能)
  • 身份验证数据包(继承数据包类)
  • AuthSend (AuthPackets 的发送函数)
  • AuthRecv (recv functions for 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类的一部分?(已经继承了数据包)。

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

authpackets.send.SecureToken

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

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

您需要有关您正在尝试执行的操作的更多信息才能获得完整的答案。

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