我不理解依赖性倒置与Gof着作中的着名短语之间的区别,即“程序接口,而不是实现”。 DIP的定义阐述了这些原则:
似乎两个原则都做同样的事情:将接口与实现分离。
答案 0 :(得分:2)
“接口程序,而不是实现程序”是OOP中一般意义上的一个很好的建议(即使您的语言不支持接口的概念)。这个想法是发送消息的对象不应该关心接收者的具体情况(例如,哪个类是属于给定层次结构的实例,或者它是否属于给定的层次结构),只要它可以回答一组消息(从而执行)一系列行为)。如果你看一下GoF中的模式,其中一个主要的底线是,只要你对一个接口进行编程,就可以用另一个替换目标对象,而不必在客户端中改变任何东西。
关于Dependency Inversion Principle我认为它只是前一个想法的具体应用。在分层体系结构的上下文中,您将编程的概念应用于接口而不是具体类,目的是将较低层与较高层分离,以获得灵活性和可重用性。
HTH
答案 1 :(得分:0)
假设您的Computer
class
定义如下:
public class Computer
{
public string OwnerName{get; set;}
public int RAMCapacity{get; set;} //Hardware based property
public string OperatingSystem{get; set;} //Software based property
}
现在,编程为Interface
表示根据上面的代码注释,您应该创建一个ISoftwareComponents
和IHardwareComponents
接口,并将这些属性移动到相应的接口,并在{{1}中实现这两个接口类如下:
Computer
现在public interface ISoftwareComponents
{
string OperatingSystem{get; set;}
}
public interface IHardwareComponents
{
int RAMCapacity{get; set;}
}
public class Computer : ISoftwareComponent, IHardwareComponents
{
public string OwnerName{get; set;}
public int RAMCapacity{get; set;} //IHardwareComponents property
public string OperatingSystem{get; set;} //ISoftwareComponents property
}
类的客户端代码可以使用如下代码:
Computer
您也可以只将计算机的软件和硬件接口部分传递给其他类和方法,如下所示:
Computer comp = new Computer();
//software requirements can use the below code:
string os = ((ISoftwareComponents)comp).OperatingSystem; // and, other variations by method calls
//hardware requirements can use the below code
int memory = ((IHardwareComponents)comp).RAMCapacity; //and, other variations
详细了解上述示例,您会了解更多信息。