如何设计我需要在基础 class 中使用派生 class 成员的 class?
How to design class that I need use derived class member in base class?
一般我们使用虚函数或者组合来设计class.As我知道,使用虚函数会让class更有条理;使用组合将很容易实现,但可能会编写更多重复代码。
在这种情况下:我需要一个解析器,它将用于不同的 protocol.Now,我想它将在名为 AParser 的 A-Protocol 中使用,在名为 BParser 的 B-Protocol 中使用,如下所示:
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
都是自己的私有数据,不应该放到base class,
另外,不应该virtual AData/BData Data() = 0
(错误!!!)
那么,如何设计class来解决问题呢?
现在我有两个想法,但是我觉得都不能让我满意
- 用
static_cast<derived_class>(this)->derivedFunc()
,一是这个操作不优雅,二是我用这个操作,Inheritance + encapsulation
还有意义吗?
- 使用普通函数,如
virtual std::map<std::string, void *> GetData() = 0
,然后使用member field name
获取归档数据,但是如何使用派生函数还是个问题?
我认为这个问题可能是一个class设计问题,你能帮我回答一下吗?
如果两个解析器没有 return 相同的数据,则它们没有相关的接口,可能不应该有共同的基础 class。
如果他们做 return 相同的数据,将 GetData
函数放在基础 class 中。或者更好的是,return 数据直接来自 Parse
.
一般我们使用虚函数或者组合来设计class.As我知道,使用虚函数会让class更有条理;使用组合将很容易实现,但可能会编写更多重复代码。 在这种情况下:我需要一个解析器,它将用于不同的 protocol.Now,我想它将在名为 AParser 的 A-Protocol 中使用,在名为 BParser 的 B-Protocol 中使用,如下所示:
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
都是自己的私有数据,不应该放到base class,
另外,不应该virtual AData/BData Data() = 0
(错误!!!)
那么,如何设计class来解决问题呢? 现在我有两个想法,但是我觉得都不能让我满意
- 用
static_cast<derived_class>(this)->derivedFunc()
,一是这个操作不优雅,二是我用这个操作,Inheritance + encapsulation
还有意义吗? - 使用普通函数,如
virtual std::map<std::string, void *> GetData() = 0
,然后使用member field name
获取归档数据,但是如何使用派生函数还是个问题?
我认为这个问题可能是一个class设计问题,你能帮我回答一下吗?
如果两个解析器没有 return 相同的数据,则它们没有相关的接口,可能不应该有共同的基础 class。
如果他们做 return 相同的数据,将 GetData
函数放在基础 class 中。或者更好的是,return 数据直接来自 Parse
.