如何在基类中使用派生类成员设计我需要的类?

问题描述

通常,我们使用虚函数或组合来设计类。据我所知,使用虚函数会使类更加结构化;使用组合将很容易实现,但也许编写更多重复的代码在这种情况下:我需要一个解析器,它将用于不同的协议。现在,我想它将在名为AParser的A协议,名为BParser的B协议中使用,如下所示:@H_404_1@

class Parser {
 public:
  Parser(...);
  virtual ~Parser() = default;
  virtual bool Parse(...) = 0;

 private:
  // some attributes may be common
};

class AParser() : public Parser {
 public:
  AParser(...) : Parser() {};
  ~AParser() override = default;

  void bool Parser(...) override;
  inline AData Data() const { return AData_;}

 private:
  AData_;
}

class BParser() : public Parser {
 public:
  BParser(...) : Parser() {};
  ~BParser() override = default;

  void bool Parser(...) override;
  inline BData Data() const { return BData_;}

 private:
  BData_;
}

好吧,ADataBData都是他们自己的私有数据,不应放在基类中,@H_404_1@

也不应virtual AData/BData Data() = 0错误!!!)@H_404_1@

那么,如何设计类来解决问题? 现在我有两个想法,但我认为他们不能令我满意@H_404_1@

  1. 使用static_cast<derived_class>(this)->derivedFunc(),首先,此操作不太好,其次,如果我使用此操作,Inheritance + encapsulation仍然有意义吗?
  2. 使用virtual std::map<std::string,void *> GetData() = 0之类的通用函数,然后使用member field name获取归档数据,但是如何使用派生功能仍然是一个问题?

我认为这个问题可能是课堂设计问题,请您帮我回答一下问题吧?@H_404_1@

解决方法

如果两个解析器不返回相同的数据,则它们不具有相关接口,并且可能不应该具有公共基类。

如果它们确实返回相同的数据,则将GetData函数放在基类中。或者更好的是,直接从Parse返回数据。