Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 区别于;依赖抽象而不是具体的类”;及;编程到一个接口“;_Oop_Design Principles - Fatal编程技术网

Oop 区别于;依赖抽象而不是具体的类”;及;编程到一个接口“;

Oop 区别于;依赖抽象而不是具体的类”;及;编程到一个接口“;,oop,design-principles,Oop,Design Principles,我不清楚这两个原则之间的区别。它们看起来是一样的 如果有的话,有什么区别?与《头先设计模式》一书第139页中关于“依赖倒置”原则的内容不同: 依赖倒置原则:依赖于抽象。不要依赖于具体的类别 起初,这个原则听起来很像“编程到接口,而不是实现”,对吗?这是相似的;然而,依赖倒置原则对抽象做出了更有力的陈述。它表明,我们的高水平组成部分不应依赖于我们的低水平组成部分;相反,它们都应该依赖于抽象 “高级”组件是一个类,其行为是根据其他“低级”组件定义的。例如,PizzaStore是一个高级组件,因为它的

我不清楚这两个原则之间的区别。它们看起来是一样的


如果有的话,有什么区别?

与《头先设计模式》一书第139页中关于“依赖倒置”原则的内容不同:

依赖倒置原则:依赖于抽象。不要依赖于具体的类别

起初,这个原则听起来很像“编程到接口,而不是实现”,对吗?这是相似的;然而,依赖倒置原则对抽象做出了更有力的陈述。它表明,我们的高水平组成部分不应依赖于我们的低水平组成部分;相反,它们都应该依赖于抽象

“高级”组件是一个类,其行为是根据其他“低级”组件定义的。例如,
PizzaStore
是一个高级组件,因为它的行为是根据pizzas定义的-它创建所有不同的pizza对象,准备、烘焙、切割和包装它们,而它使用的pizzas是低级组件

下面的代码遵循“编程到接口,而不是实现”的原则,因为您正在对抽象调用
Bake
Deliver
。但它并不遵循DI原则,因为您的第一块代码仍然依赖于一些具体的
Pizza
类型

public class PizzaStore
{
    public void OrderPizza(PizzaType type)
    {
        Pizza pizza;
        switch(type)
        {
            case PizzaType.FourSeasons:
                pizza = new FourSeasonsPizza();
            //...
        }

        //do something with pizza
        pizza.Bake();
        pizza.Deliver();
    }
}
通过使用工厂方法模式或抽象工厂模式,您可以同时遵循这两个原则。现在,您正在针对抽象进行编程,并且您完全依赖于抽象。比萨饼店依赖于两种抽象:
pizza
PizzaFactory

public class PizzaStore
{
    private PizzaFactory factory;

    public PizzaStore(PizzaFactory factory)
    {
        this.factory = factory;
    }

    public void OrderPizza(PizzaType type)
    {
        Pizza pizza = factory.CreatePizza(type);

        //do something with pizza
        pizza.Bake();
        pizza.Deliver();
    }
}

是的,DI原则包括“程序到接口”原则。

在GoF模式书中,你可以找到“接口”的定义对象操作定义的所有签名集称为对象的接口。本书中的接口是在.h文件中声明的,并与实现分离。因此,给定的原则是同义的


不熟悉GoF模式书的.NET开发人员可能会被这本书弄糊涂。

好吧,这本书正好引出了这个问题,因为它介绍了这两个不同的原则,但解释对我来说是不够的。我最多只能看到一个界面的
程序
已经包含在
依赖抽象中,我认为抽象就是用不同的词来表达
争取松散耦合。@LeNoob我已经更新了我的帖子,希望现在更清楚。我同意你的观点,DI原则包括对接口进行编程。