微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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都是他们自己的私有数据,不应放在基类中,

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

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

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

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

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。