概要
这两天工作中,看到一段代码实现是用抽象类的指针作为成员变量。然后通过上层传入具体实现类的指针赋值。那么我们为什么要用抽象类指针作为成员变量呢?
代码
class Manager {
public:
std::unique_ptr<IManagerFactory> ManagerFactory;
Manager(std::unique_ptr<IManagerFactory> factory)
: ManagerFactory(std::move(factory)) {}
void createTask() {
auto task = ManagerFactory->create();
// 使用 task
}
};
提示:这里std::unique_ptr<IManagerFactory> ManagerFactory; 就是用抽象类指针定义的成员变量
解释
C++中,不能直接实例化抽象类(虚类),但可以使用指向抽象类的指针或引用来定义成员变量。这是因为指针和引用只存储对象的地址,而不需要知道对象的具体类型。
将成员变量定义为抽象类(虚类)的指针或引用,而不是具体类的实例,是为了实现面向对象编程中的多态性和依赖倒置原则。这样做有以下几个好处:
-
- 多态性
通过使用抽象类的指针或引用,你可以在运行时决定使用哪个具体实现类。这使得代码更加灵活和可扩展。
- 多态性
-
- 依赖倒置原则
依赖倒置原则(Dependency Inversion Principle, DIP)是SOLID原则之一。它建议高层模块不应该依赖于低层模块,而是都应该依赖于抽象。通过依赖抽象类而不是具体类,可以减少模块之间的耦合,提高代码的可维护性和可测试性。
- 依赖倒置原则
-
- 测试友好
使用抽象类作为成员变量,可以在单元测试中轻松地使用模拟对象(mock objects)来替代实际的实现类,从而进行隔离测试。
- 测试友好
小结
通过这种方式,你可以在不修改 Manager
类的情况下,轻松地替换 IManagerFactory
的具体实现,从而提高代码的灵活性和可扩展性。