问题描述
通常,我们使用虚函数或组合来设计类。据我所知,使用虚函数会使类更加结构化;使用组合将很容易实现,但也许编写更多重复的代码。 在这种情况下:我需要一个解析器,它将用于不同的协议。现在,我想它将在名为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_;
}
好吧,AData
和BData
都是他们自己的私有数据,不应放在基类中,@H_404_1@
也不应virtual AData/BData Data() = 0
(错误!!!)@H_404_1@
那么,如何设计类来解决问题? 现在我有两个想法,但我认为他们不能令我满意@H_404_1@
- 使用
static_cast<derived_class>(this)->derivedFunc()
,首先,此操作不太好,其次,如果我使用此操作,Inheritance + encapsulation
仍然有意义吗? - 使用
virtual std::map<std::string,void *> GetData() = 0
之类的通用函数,然后使用member field name
获取归档数据,但是如何使用派生功能仍然是一个问题?
我认为这个问题可能是课堂设计问题,请您帮我回答一下问题吧?@H_404_1@
解决方法
如果两个解析器不返回相同的数据,则它们不具有相关接口,并且可能不应该具有公共基类。
如果它们确实返回相同的数据,则将GetData
函数放在基类中。或者更好的是,直接从Parse
返回数据。