c# - 我想我错过了 "Programming to an interface"概念的一些东西

标签 c# interface

所以我对 C# 和接口(interface)的使用还很陌生,当我认为我理解它们时,我意识到我并不完全理解。我发现我在这里寻求澄清的困惑是,当您创建一个接口(interface)并让一个类继承它时

public Interface ISomeInterface
{
  //some methods/properties
}

public class FooClass : ISomeInterface
{
  //implemented ISomeInterfaces methods/properties
}

然后您在程序某处的实现中使用此类对象

public class BarClass 
{
  private ISomeInterface _someInterface;
  public BarClass(ISomeInterface someInterface)
  {
    _someInterface = someInterface;
  }
  //rest of class
}

我的困惑是为什么我看到它是这样设置的。我以为我会实例化一个 FooClass 类型的新对象,并在构造函数中使用一个 FooClass 类型的对象:

public class BarClass 
{
  private FooClass _fooClass;
  public BarClass(FooClass fooClass)
  {
    _fooClass = fooClass;
  }
  //rest of class
}

我缺少什么来理解这一点?我不认为我会直接声明接口(interface)的对象?

提前致谢。

最佳答案

想法是 BarClass 不应与 ISomeInterface 的特定实现紧密耦合。

如果你使用这个:

public BarClass(FooClass fooClass)

这意味着 BarClass 只能与这个特定的 FooClass 实现一起工作,而不能与其他任何东西一起工作。而如果您使用:

public BarClass(ISomeInterface fooClass)

现在 BarClass 不再与 FooClass 紧密耦合。这意味着 BarClass 的消费者现在可以传递他想要的接口(interface)的任何实现,只要它尊重定义的契约(接口(interface))。因此,如果他想要 FooClass,他会传递 FooClass 的实例,但如果他对 FooClass 不满意,他可以编写自己的实现并传递它对于构造函数,从 BarClass 的角度来看,这是绝对透明的(不需要修改)。

类之间的弱耦合是 OOP 最基本的方面之一,因为它允许您轻松地将一个组件替换为另一个组件,而无需重写整个应用程序。

关于c# - 我想我错过了 "Programming to an interface"概念的一些东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4233249/

相关文章:

c# - Entity Framework - 从数据库第一个存储过程返回 GUID

c# - 使用 Javascript 的标签菜单

c# - LINQ to SQL 中的错误,数据库上有空字符串

java - 每个 Java 域类都应该实现一个接口(interface)吗?

java - 为什么java中的Stack类不会在 'add'方法上抛出UnsupportedOperationException?

javascript - 有什么办法可以解决 Typescript 在某些范围内卡住对象而不是其他范围内的倾向吗?

java - 使视频充满屏幕并保持宽高比

c# - 将 IEnumerable<WebSocketHandler> 转换为 WebSocketCollection

java - 向所有实现接口(interface)的类添加方法

php - php中抽象和接口(interface)有什么区别?