id继承类的最佳方法

时间:2012-06-25 04:18:18

标签: c++ oop

我正在使用C ++中的一个小框架来在我的一些项目中使用,以静态链接作为各种实用程序库。我想你可以将它与一个更符合我个人需求的域名进行比较,以及更简单的库juce.这是一个学习和体验练习,所以我想花点时间做事情正确并理解我应用的技巧。我目前正在使用linux,但目标是使代码可移植,因此这将允许我将任何特定于平台的代码编写到接口。

目前我正在开发一个基本的消息系统,我想允许包含各种类型对象的消息。我最初的想法是这样的:

class Message {
  virtual std::string type;
};
class DataMessage : Message {
  std::vector<std::string> *data;
};

我的问题是,识别Message是DataMessage的最佳方法是什么,并将其转换为实际类型,还是访问它包含的数据?

我可以使用类似上面类型的字符串,但这并不能保证每个子类实际上都有唯一的类型ID。另外,我想知道字符串处理的开销是否会慢于替代(例如,我可以扩展枚举吗?)。

至于访问数据,如果我可以将Message转换为正确的类型,这不是问题。否则,我可以将一个虚函数添加到基类作为访问器(但是我如何使用不同的返回类型到基类中指定的类型?如果该类不需要任何其他数据怎么办? ),或作为一个作用于数据的工作函数(但我宁愿把它作为类之间的数据传递机制,而不是回调样式框架)。

非常感谢任何建议,替代方案或链接。讨论不同的方法会很棒!

先谢谢你们。

3 个答案:

答案 0 :(得分:3)

  

我的问题是,确定Message是DataMessage的最佳方法是什么,并将其转换为实际类型,还是访问它包含的数据?

你不应该那样做! 一旦你这样做,你就会使你的设计变得脆弱。你最终打破了 SOLID paradigm 的基本原则之一, "Liskov Substitution Principle"
请注意,如果您执行操作,如果您执行操作,具体取决于您要编写的实现的对象的具体类型,而不是接口。基本设计指南是:
“界面代码而非实施。”
如果您开始编写具体类型的代码,您的代码将变得更难以维护并且更紧密地耦合。每次您想要添加新的派生类时,您的代码甚至会进一步分解并且您失去了慷慨。

您应该依靠多态来为您完成任务。 您应该在基类中实现虚方法,并在派生类中适当地覆盖它们。你只需要调用这样一个方法,并且运行时会在每个类中调用适当的方法,因为运行时知道具体类型是什么。重要的是你编写的代码需要不知道的类型。

您可能需要查看一些好的模式,例如 Template method pattern ,这些模式可能对您有用。

答案 1 :(得分:2)

使用typeid运算符。这是C ++ RTTI的一部分。几乎所有编译器都支持它。 虽然这是你自己的框架,但使用数据字段(更好的枚举类型)也不是那么糟糕。

答案 2 :(得分:2)

您可以使用DataMessage* pDataMessage = dynamic_cast<DataMessage*>(pMessage)。仅当pDataMessagepMessage对象时,DataMessage才有效。否则它将是NULL