Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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
C# 使类依赖项显示在接口中,而不是属性_C#_.net_Oop_Interface - Fatal编程技术网

C# 使类依赖项显示在接口中,而不是属性

C# 使类依赖项显示在接口中,而不是属性,c#,.net,oop,interface,C#,.net,Oop,Interface,我有一个接口和一个实现该接口的类 public abstract class AMyClass { protected ITimer MyTimer; public AMyClass(ITimer timer) { MyTimer = timer; } public abstract void DoSomething(); } public class MyClass : AMyClass { public override void DoSomething

我有一个接口和一个实现该接口的类

public abstract class AMyClass
{
  protected ITimer MyTimer;

  public AMyClass(ITimer timer)
  {
    MyTimer = timer;
  }

  public abstract void DoSomething();
}

public class MyClass : AMyClass
{
  public override void DoSomething()
  {

  }
}
我有一个要求,该类依赖于ITimer。创建一个私有成员,传入一个构造函数参数,并将该私有成员分配给该构造函数参数

如何使接口以某种方式声明了此ITimer,但不将其作为属性?这并不是说我不能正确地测试我的类,但我认为接口应该是一个类必须遵守的契约,因此我的类具有依赖性,那么我如何使它出现在接口中呢

public interface IMyInterface
{
  void DoSomething();
}

public class MyClass : IMyInterface
{
  private ITimer MyTimer;

  public MyClass(ITimer timer)
  {
    MyTimer = timer;
  }

  public void DoSomething()
  {

  }
}

这是行不通的,也很好,它行不通:

您对ITimer的依赖不是接口的一部分,它是接口实现的一部分-因此对接口隐藏这一点是正确的


如果接口的所有实现都需要依赖于ITimer,并且只有在这样的情况下,才应该附加接口声明来考虑这一点。

这将不起作用,很好,它将不起作用:

您对ITimer的依赖不是接口的一部分,它是接口实现的一部分-因此对接口隐藏这一点是正确的


如果接口的所有实现都需要依赖于ITimer,并且只有在这样的情况下,才应该附加接口声明来考虑这一点。

这不能用C中的接口来完成。您可以做的是从抽象类继承接口

public abstract class AMyClass
{
  protected ITimer MyTimer;

  public AMyClass(ITimer timer)
  {
    MyTimer = timer;
  }

  public abstract void DoSomething();
}

public class MyClass : AMyClass
{
  public override void DoSomething()
  {

  }
}

这不能用C中的接口来完成。您可以做的是从接口的抽象类instread继承

public abstract class AMyClass
{
  protected ITimer MyTimer;

  public AMyClass(ITimer timer)
  {
    MyTimer = timer;
  }

  public abstract void DoSomething();
}

public class MyClass : AMyClass
{
  public override void DoSomething()
  {

  }
}

接口是类公开的功能的契约。如果接口中没有ITimer的自然位置,那么它看起来像是实现它的特定类中的实现细节,因此应该保留在类中。

接口是类公开的功能的契约。如果接口中没有ITimer的自然位置,那么它看起来像是实现它的特定类中的实现细节,因此应该保留在类中。

如果一个类可以在不使用ITimer的情况下实现您的接口,它不符合接口吗?显然是这样


ITimer的使用是一个实现细节,因此它不应该在接口中表示。

如果一个类可以在不使用ITimer的情况下实现您的接口,它不符合接口吗?显然是这样

public abstract class AMyClass
{
  protected ITimer MyTimer;

  public AMyClass(ITimer timer)
  {
    MyTimer = timer;
  }

  public abstract void DoSomething();
}

public class MyClass : AMyClass
{
  public override void DoSomething()
  {

  }
}

ITimer的使用是一个实现细节,因此它不应该在接口中表示。

如果您在接口上有一个明确不想要的依赖项,例如ITimer,那么它听起来像是一个实现细节,因此它没有被定义为合同的一部分是正确的。一种方法是忘掉ITimer;只有一些实现可能需要它,这是IoC/DI解析器关心的问题

public abstract class AMyClass
{
  protected ITimer MyTimer;

  public AMyClass(ITimer timer)
  {
    MyTimer = timer;
  }

  public abstract void DoSomething();
}

public class MyClass : AMyClass
{
  public override void DoSomething()
  {

  }
}
显然,构造函数不是接口的一部分。在保持IMyInterface远离API的同时,我唯一能想到的另一件事是有一个IMyInterfaceFactory接口,带有一个接受ITimer的Create方法,但这会强制执行一组特定的依赖项,这可能不会反映实际的实现


如果上面没有一个套件,而且ITimer本质上是接口的一部分,我会将它正式地作为接口的一部分

如果接口上存在明确不需要的依赖项(如ITimer),那么它听起来像是一个实现细节,因此它没有被定义为合同的一部分是正确的。一种方法是忘掉ITimer;只有一些实现可能需要它,这是IoC/DI解析器关心的问题

显然,构造函数不是接口的一部分。在保持IMyInterface远离API的同时,我唯一能想到的另一件事是有一个IMyInterfaceFactory接口,带有一个接受ITimer的Create方法,但这会强制执行一组特定的依赖项,这可能不会反映实际的实现


如果上面没有一个套件,而且ITimer本质上是接口的一部分,我会将它正式地作为接口的一部分

为什么属性不合适?您可以拥有一个带有私有setter的属性,它似乎完全满足您的需要

另一个选项是从带有受保护计时器的抽象基类派生,同时实现接口


从理论上讲,依赖注入是您所寻找的。因此,可能值得花时间来研究控制反转容器。

为什么属性不合适?您可以拥有一个带有私有setter的属性,它似乎完全满足您的需要

另一个选项是从带有受保护计时器的抽象基类派生,同时实现接口

理论上依赖Inj

这就是你要找的。因此,可能值得花时间来研究控制容器的反转。

听起来您希望能够让接口强制所有实现类都有一个采用ITimer的构造函数,是吗?你不能用界面来做这件事,从技术上讲,这不是对提出的问题的回答,而是作为你问题的解决方案。将MyClassBase定义为抽象的基类/类型,并针对它与接口进行编码如何?听起来您希望能够让接口强制所有实现类都有一个采用ITimer的构造函数,对吗?你不能用界面来做这件事,从技术上讲,这不是对提出的问题的回答,而是作为你问题的解决方案。将MyClassBase定义为一个抽象的基类/类型,并针对它与接口进行编码如何?在不将依赖项作为属性的情况下,您将如何做到这一点?这当然取决于您的代码的功能,但我可能会选择无参数构造函数和作为接口一部分的setTimer方法。我认为构造函数中的ITimer仍然合适,但在接口中有一个名为setTimer的方法是个好主意,因为它表明需要计时器。显然,它没有将ITimer作为接口依赖项公开,但可能更接近于确保所有类实现都使用timerAgain,而不了解代码的真正功能,我没有一个坚实的基础来判断。例如,如果接口有一个UseTimer属性,在DoSomething方法中,如果它是真的,它会设置一个计时器,那么在不使依赖项成为属性的情况下,您将如何进行设置?这当然取决于您的代码是什么,但我可能会选择无参数构造函数和作为接口一部分的setTimer方法。我认为构造函数中的ITimer仍然合适,但在接口中有一个名为setTimer的方法是个好主意,因为它表明需要计时器。显然,它没有将ITimer作为接口依赖项公开,但可能更接近于确保所有类实现都使用timerAgain,而不了解代码的真正功能,我没有可靠的依据来判断。例如,如果接口具有UseTimer属性,并且在DoSomething方法中,如果它为真,它会设置一个时间。但是,如果您将其作为接口的一部分,那么您会将其公开,并且您不希望允许用户更改ITimer的某些部分。说你可能需要公开属性,比如Interval,所以我想如果你让一些东西可见,那么我想可以公开整个timer@Jon我把ITimer的内部工作完全交给了ITimer。你没有展示它是如何定义的,所以我不能推荐任何关于它的东西。目前它公开了System.Timers.Timer的所有属性。但是如果你把它作为界面的一部分,你就公开了它,并且你不想让用户更改ITimer的某些部分。说你可能需要公开属性,比如Interval,所以我想如果你让一些东西可见,那么我想可以公开整个timer@Jon我把ITimer的内部工作完全交给了ITimer。你没有展示它是如何定义的,所以我不能推荐任何关于它的东西。目前,它公开了System.Timers.TimerYes的所有属性-这是询问者寻找的正确答案。接口无法定义对象的构造方式,因为它(根据定义)没有定义实现。但是,需要记住的一点是,有一个看起来不像接口的实现是可以的,因为接口只是面向消费者的。因此,要么使用一个基本抽象类,甚至可以从接口继承,要么保持实现的不同。如果您有任何问题,请告诉我们。是的-这是询问者所寻找的正确答案。接口无法定义对象的构造方式,因为它(根据定义)没有定义实现。但是,需要记住的一点是,有一个看起来不像接口的实现是可以的,因为接口只是面向消费者的。因此,要么使用一个基本抽象类,甚至可以从接口继承,要么保持实现的不同。如果您有任何问题,请告诉我们。如果类中有私有setter,它将不会实现接口,因为它必须是公共的。我想抽象类是正确的答案,为什么不这样添加smth呢?接口IMyInterface{int-ITimer-MyTimer{get;}}内部类MyClass-IMyInterface{public-ITimer-MyTimer{get;set;}}如果类中有私有setter,它将不会实现该接口,因为它必须是公共的。我想抽象类是正确的答案,为什么不这样添加smth呢?接口IMyInterface{int ITimer MyTimer{get;}}}i 内部类MyClass IMyInterface{public ITimer MyTimer{get;set;}