如何重构现有的类以变成多态?

时间:2010-06-29 10:31:14

标签: c++ class oop polymorphism

我有一个类在我的项目的许多地方用作成员。 现在,我想要有一个多态,而不是这个类,实际的对象将由某种工厂创建。

我必须在:

之间做出选择
  1. 必须更改我使用该类的所有地方 - 调用工厂并直接使用指针代替对象。
  2. 将类更改为只是一个包装器,它将调用我将创建的新多态类的函数。
  3. 我最好选择哪种策略?

3 个答案:

答案 0 :(得分:4)

更改我使用该类调用工厂的所有位置,并直接使用指针而不是对象。

那是最好的。一开始看起来很痛苦,但它比实现包装器更干净,更具扩展性,因为你不想搜索new MyClass(

一旦列出了new所有的地方,你就会发现工作真的不是那么糟糕。

答案 1 :(得分:2)

即使您使用#2并实现基类包装器,您仍然需要修改客户端代码(通过工厂构建不同的方法,例如,对于多态基础包装器)。

我会选择#1但不是常规指针,而是像boost :: shared_ptr或boost :: scoped_ptr(取决于你需要的东西)。

第二个选项可能允许你对基础包装器接口采取一些自由,但我建议不要这样做:尽可能支持常用的方法。如果基类包装器提供了boost :: shared_ptr不提供的附加功能,例如,它将是一个在系统中引入新概念的外来实体,并且可能很少或根本没有显示它的好处。

在最好的情况下,你的基类包装器复制了大多数开发人员喜欢的东西的接口,比如boost :: shared_ptr,在这种情况下,它重新发明轮子,你可能也使用了boost :: shared_ptr。在最糟糕的情况下,您的包装器类引入了一个完全不同的接口,因此将外部代码引入系统,其他人无法立即识别。

无论您有多好,其他开发人员都可以更轻松地信任并使用经过同行评审,记录完备,经过全面测试的库,比如一名工程师提供的手动解决方案。如果只是因为这个原因,尽量使用现有的库解决方案,而更喜欢那些自定义基类包装器。

答案 2 :(得分:1)

您使用包装器的想法甚至有一个名称。它是letter/envelope idiom,正如Coplien所描述的那样(在他们开始称这些成语为“模式”之前)。 谷歌finds you more explanations

与其他人相反,我认为使用它没有任何问题。对于类的用户来说,处理行为像值类型一样简单的事情要容易得多。没有必要使用工厂或工厂方法来创建对象的麻烦,因为类的构造器是工厂 - 这是构造者首先发明的。 这可能有什么问题?

相关问题