我是一名有用的助手,可以为您翻译文本。
我对C++类设计有一个通用问题。例如,我需要一个数据包生成器。因此,根据数据包的类型,我必须生成该类型的数据包。因此,我有一个基础数据包生成器类。
方法1:
class BasePacketGenerator {
public:
virtual Packet* generatePacket (int type); // implements the generic case
// hence not pure virtual
protected:
//
// Common functionality for all types
//
virtual void massagePacket (Packet& pkt); // called by generatePacket
// but needs special handling for
// some types
virtual void calculateCheckSum(Packet& pkt); // called by generate packet
...
};
处理每种类型的派生类:
class Type1PacketGenerator : public BasePacketGenerator {
public:
// Dont have to override any base class implementationa
protected:
void calculateCheckSum(Packet& pkt) override;
};
class Type2PacketGenerator : public BasePacketGenerator {
public:
Packet* generatePacket(int type) override;
};
在Type1生成器中,我们使用多态。但是基类调用的是派生类的功能,实现了多态性。我想知道这是否是一个好的习惯?或者需要一个中介类。
方法2:
class TypeHandler {
virtual Packet* setupPacket();
virtual void calculateCheckSum(Packet& pkt);
virtual void setupFields (Packet& pkt);
}
class PacketGenerator {
public:
TypeHandler *handler_; // lets say this is setup based on the type
Packet* generatorPacket(int type)
{
auto packet = handler_->setupPacket();
handler_->massagePacket();
handler_->calculateCheckSum(*packet);
return packet;
}
}
采用哪种方法有什么优势吗?
Approach1更灵活,因为它不必遵循相同的做事方式。例如:如果Type2Generator不需要校验和,则甚至不必调用calculateCheckSum(),如果需要一些额外的功能,则不必将其添加到所有类型生成器中。
但是,Approach2更易读,因为所有类型都以相同的方式执行操作。