没有完全理解为什么我在一个类中有一个接口,而不是从它继承

时间:2018-05-23 20:38:18

标签: c# interface

我正在查看SOLID原则,并为SRP遇到了一些代码。

我有这个代码,但我不知道为什么我有一个接口,以下面的方式声明?这对我有什么好处?我找到了here,它显示了一个解决方案,但它并没有真正解释代码如何更好地工作或为什么事情就是这样。

我不明白的是:

IGateUtility _gateUtility;public class ServiceStation中,正下方是IGateUtility作为参数的构造函数。为什么这样写的?什么是我必须通过的参数。

public class ServiceStation
{
    IGateUtility _gateUtility;

    public ServiceStation(IGateUtility gateUtility)
    {
        this._gateUtility = gateUtility;
    }
    public void OpenForService()
    {
        _gateUtility.OpenGate();
    }

    public void DoService()
    {
        //Check if service station is opened and then
        //complete the vehicle service
    }

    public void CloseForDay()
    {
        _gateUtility.CloseGate();
    }
}

public class ServiceStationUtility : IGateUtility
{
    public void OpenGate()
    {
        //Open the shop if the time is later than 9 AM
    }

    public void CloseGate()
    {
        //Close the shop if the time has crossed 6PM
    }
}


public interface IGateUtility
{
    void OpenGate();

    void CloseGate();
}

2 个答案:

答案 0 :(得分:2)

构造函数参数是依赖注入的一个示例,特别是称为"构造函数注入" (这通常是首选技术)。

ServiceStation不应该包含IGateUtility的逻辑,因为它与门没有任何关系(单一责任原则)。它确实需要使用门,所以你传递一个实现IGateUtility的对象。

一般来说,我不认为继承在这种情况下是有意义的;但有一个原则是:

  

首选组合继承

这基本上意味着;注入(组合)对象以获取对其行为的访问权,而不是从它们继承。

答案 1 :(得分:1)

SRP代表单一责任原则。所以服务类没有任何责任来创建 ServiceStationUtility 对象。

让我们通过一个例子来理解它。假设您没有使用任何界面,那么您的代码如下所示。

    public class ServiceStation
    {
      ServiceStationUtility  _gateUtility;

    public ServiceStation()
    {
        this._gateUtility = new ServiceStationUtility();
    }
    public void OpenForService()
    {
        _gateUtility.OpenGate();
    }

    public void DoService()
    {
        //Check if service station is opened and then
        //complete the vehicle service
    }

    public void CloseForDay()
    {
        _gateUtility.CloseGate();
    }
     }

   public class ServiceStationUtility 
   {
       public void OpenGate()
       {
        //Open the shop if the time is later than 9 AM
       }

      public void CloseGate()
      {
        //Close the shop if the time has crossed 6PM
      }
    }

因此,现在不使用界面,Service Station类还负责创建 ServiceStation 对象,这违反了 SRP

第二个问题

如果您想为 OpenGate() CloseGate()提供不同的实现,请使用以上代码。你必须创建另一个类。因此,您必须再次更改 ServiceStation 类中的代码。

使用界面的原因

接口允许依赖注入。这意味着对象创建任务被委托给第三方。这意味着 ServiceClass 不需要知道谁是该对象的实际提供者。 ServiceClass ,请关注  在这里界面。对于 ServiceStationUtility 课程,此课程也不知道谁将使用它。

因此,界面有助于构建松散耦合架构