我正在尝试理解和应用SOLID原则。
关于依赖倒置原则,这是否意味着禁止对对象进行合成/聚合?
因此,必须始终使用接口(interface)来访问另一个类方法?

我的意思是:

class ServiceClass {
  void serviceClasshelper();
}

class MainClass {
  void MainClass(ServiceClass service); // To use serviceClasshelper
}

必须更改为:
class ServiceInterface {
  virtual void interfaceHelper() =0;
}

class ServiceClass : public ServiceInterface {
  void serviceClasshelper();
  void interfaceHelper() { serviceClasshelper(); };
}

class MainClass {
  void MainClass(ServiceInterface service); // Uses interfaceHelper
}

我认为(或至少希望如此)我理解该原理。
但是想知道它是否可以这样改写。
确实,我读到的有关DIP的文章建议使用接口(interface)。

谢谢!

最佳答案

基本上,DIP的主要思想是:



如您所见,它说应该为,而不是必须为。它不禁止您做任何事情。

如果您的类composite of / aggregate to其他特定的classes(不是interfaces / abstract classes),那就很好!您的代码仍将编译并运行,不会显示警告消息:“嘿,您违反了DIP”。因此,我认为您的问题的答案是:不,不是

想象一下,您的系统由一千个类组成,您可以将DIP应用于两个类,而其中一个依赖于第三个特定类(不是interfaces / abstract classes)。只要您的问题得到解决,就无关紧要。因此,请尝试使您的解决方案简短明了->易于理解。相信我,当您回顾解决方案后的一个月,您会发现它很有值(value)。

DIP是一个指南,它告诉您在面对一系列特定问题时应采取的措施以解决这些问题。这不是一个神奇的准则,它要付出一定的代价:复杂度。应用DIP越多,系统将越复杂。因此,请明智地使用它。为了进一步支持这一点,我建议您看一下该引用(摘自Head First: Design Patterns书)。访问此link(这是一个PDF文件),然后在顶部栏导航到635 / 681页。或者,如果您足够懒惰,请阅读以下报价:



最后,我将为您介绍利用DIP的“四人一组”设计模式:Strategy

示例问题:Character可以使用3种武器:HandSwordGun。他(Character)可以随时交换当前武器。

分析:这是一个非常典型的问题。棘手的部分是如何在运行时处理武器交换。

带有策略:(只是草图)的候选解决方案:

c++ - SOLID:DIP是否表示禁止对对象进行合成/聚合?-LMLPHP

weapon = new Hand();
weapon.Attack(); // Implementation of Hand class

weapon = new Sword();
weapon.Attack(); // Implementation of Sword class

weapon = new Gun();
weapon.Attack(); // Implementation of Gun class

其他使用DIP的设计模式和框架:
  • Inversion of Control (a.k.a IoC)
  • Dependency Injection
  • Autofac framework(您可以下载并使用它)
  • 07-23 15:45