我正在尝试理解和应用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种武器:Hand
,Sword
和Gun
。他(Character
)可以随时交换当前武器。
分析:这是一个非常典型的问题。棘手的部分是如何在运行时处理武器交换。
带有策略:(只是草图)的候选解决方案:
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的设计模式和框架: