返回不同类型/类的方法的设计模式

mgf*_*nan 5 c++ oop design-patterns

这是对象设计模式专家的问题.

假设我有一个Parser负责读取/解析数据流(携带不同类型的信息)的类.每个数据包携带不同类型的信息,所以最好我想有一个类为每种类型的数据包(PacketTypeA,PacketTypeB,...每个人都有自己的接口).

class Parser {

public:

    /* ctor */
    /* dtor */


   void read_packet(/* arguments */);

   // methods...
private:
   // more methods...
}
Run Code Online (Sandbox Code Playgroud)

Parser::read_packet然后,该方法将遍历流并将类(或指针或对类的引用)返回到适当的数据包类型.

你会使用void指针吗?通用类(PacketBasicInterface)如何提供一个公共(部分)接口来查询数据包的类型(以便随后可以在运行时做出任何决定)?

// Pure virtual (abstract) class to provide a common (and partial) interface
class PacketBasicInterface {
public:

    std::string whoAmI() const = 0;
    bool amIofType(const std::string& type) const = 0;

}

// Class to access data of type A packet
class PacketTypeA : public PacketBasicInterface {

public:
    // methodA_1()
    // methodA_2(), ...
}

// Class to access data of type A packet
class PacketTypeB : public PacketBasicInterface {

public:
    // methodB_1()
    // methodB_2(), ...
}
Run Code Online (Sandbox Code Playgroud)

任何想法或反馈将非常感谢!

非常感谢!

Sam*_*hik 5

这就是std :: variant的用途.

我将定义一个枚举类,枚举所有可能的数据包类型:

enum class packet_type {initialization_packet, confirmation_type, ... };
Run Code Online (Sandbox Code Playgroud)

read_packet返回一个packet_type元组和一个变体:

typedef std::variant< ... > packet_info;

std::tuple<packet_type, packet_info> read_packet();
Run Code Online (Sandbox Code Playgroud)

不需要正式的枚举,但它更容易弄清楚如何处理变体.

这种一般方法的一些变化包括:

  1. 使用不透明std::string而不是固定的枚举来指定数据包类型.

  2. 使用std::any而不是正式std::variant.

  3. 不使用简单的枚举或像a这样的不透明标记,而是std::string使用稍微不重要的类来定义数据包类型,类的方法将变量元数据作为参数,并封装可以对数据包执行的操作.

当然,如引用链接中所述,std::variant需要C++ 17.对于您更新编译器来说,这将是一个很好的理由:您可以通过一种简单的方法来实现完全类型安全的方法.