通常,我们使用虚函数或组合来设计类。据我所知,使用虚函数会使类更加结构化;使用组合将很容易实现,但也许编写更多重复的代码。在这种情况下:我需要一个解析器,它将用于不同的协议。现在,我假设它将在名为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_;
}
好了,AData
并且BData
都是自己的私人资料,不应该投入的基类,
同样,不应该virtual AData/BData Data() = 0
(错误!!!)
那么,如何设计类来解决问题呢?现在我有两个主意,但我想他们不能让我满意
static_cast<derived_class>(this)->derivedFunc()
,首先此操作不太好,其次,如果我使用此操作,是否Inheritance + encapsulation
仍然有意义?virtual std::map<std::string, void *> GetData() = 0
,然后使用member field name
来获取字段数据,但是如何使用派生功能仍然是一个问题?我认为这个问题可能是课堂设计问题,请您帮我回答这个问题?
如果两个解析器不返回相同的数据,则它们将不具有相关的接口,并且可能不应该具有公共的基类。
如果它们确实返回相同的数据,则将GetData
函数放在基类中。或者更好的是,直接从返回数据Parse
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句