DI原则和“程序接口,而不是实现”有什么区别?

时间:2013-03-04 10:44:48

标签: oop inversion-of-control

我不理解依赖性倒置与Gof着作中的着名短语之间的区别,即“程序接口,而不是实现”。 DIP的定义阐述了这些原则:

  1. 高级模块不应依赖于低级模块。两者都应该依赖于抽象。
  2. 抽象不应该依赖于细节。细节应取决于抽象。
  3. 似乎两个原则都做同样的事情:将接口与实现分离。

2 个答案:

答案 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表示根据上面的代码注释,您应该创建一个ISoftwareComponentsIHardwareComponents接口,并将这些属性移动到相应的接口,并在{{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

详细了解上述示例,您会了解更多信息。