【问题标题】:When is an "interface" useful?“接口”什么时候有用?
【发布时间】:2013-06-22 00:40:31
【问题描述】:

OOP 接口。

【问题讨论】:

  • 当你的标题比你的问题的内容长,那么它可能不是一个很好的问题。你想要好的答案,请提供一个好的问题。
  • 相关讨论见this old quesion

标签: oop interface


【解决方案1】:

根据我自己的经验,当涉及到与多个开发人员一起设计和实现多个互操作模块时,我发现接口非常有用。例如,如果有两个开发人员,一个在后端工作,另一个在前端 (UI) 工作,那么一旦他们完成接口,他们就可以开始并行工作。因此,如果每个人都遵循定义的合同,那么以后的集成就变得轻松了。而这正是接口所做的——定义契约!

基本上它避免这种情况:

【讨论】:

  • 嘿,这让我想起了我的工作......这反过来又提醒我......必须回到它(D*mn you SO!)
  • 不幸的是,重构对于那些家伙和软件人来说并不容易
【解决方案2】:

当您需要一个类对子类实现的泛型方法进行操作时,接口非常有用。

public class Person
{
  public void Eat(IFruit fruit)
  {
    Console.WriteLine("The {0} is delicious!",fruit.Name);
  }
}

public interface IFruit
{
   string Name { get; }
}
public class Apple : IFruit
{
  public string Name
  {
    get { return "Apple"; }
  }
}
public class Strawberry : IFruit
{
  public string Name
  {
    get { return "Strawberry"; }
  }
}

【讨论】:

    【解决方案3】:

    在多重继承的情况下,接口非常有用。

    【讨论】:

      【解决方案4】:
      1. 接口完全从客户端抽象出实现知识。
      2. 它允许我们动态地改变他们的行为。这意味着它的行为方式取决于动态专业化(或替代)。
      3. 如果开发人员进行了一些更改,它可以防止客户端被破坏 实施或添加新的专业化/实施。
      4. 它提供了一种扩展实现的开放方式。

      编程语言(C#、java)

      这些语言不支持类的多重继承,但是,它们支持接口的多重继承;这是界面的另一个优点。

      【讨论】:

      • 如果它写得不是太糟糕以至于你必须将每个句子读两遍,我会 +1。
      • Markdown 支持列表,请在适当的时候使用它们(并且不要在这样的代码块中抛出文本!)
      • @dbemerlin 如果您诚实并承认您需要将每个项目阅读两次以上,我会认为您的评论很棒。
      • @dbemerlin 我知道它有点晚了,但我尝试修复它。
      【解决方案5】:

      基本上,接口允许程序更改实现,而不必告诉所有客户端他们现在需要“Bar”对象而不是“Foo”对象。它告诉这个类的用户它做了什么,而不是它是什么。

      例子:

      您编写的一个方法想要遍历给它的值。现在有几个东西可以迭代,比如列表、数组和集合。

      如果没有接口,您将不得不编写:

      public class Foo<T>
      {
          public void DoSomething(T items[])
          {
          }
      
          public void DoSomething(List<T> items)
          {
          }
      
          public void DoSomething(SomeCollectionType<T> items)
          {
          }
      
      }
      

      对于每个新的可迭代类型,您都必须添加另一个方法,否则您的类的用户将不得不转换他的数据。例如,对于这个解决方案,如果他有一个 FooCollectionType 的集合,他必须将其转换为 Array、List 或 SomeOtherCollectionType。

      有了你只需要的接口:

      public class Foo<T>
      {
          public void DoSomething(IEnumerable<T> items)
          {
          }
      }
      

      这意味着你的类只需要知道用户传递给它的任何东西都可以被迭代。如果用户将他的 SomeCollectionType 更改为 AnotherCollectionType,则他不必强制转换或更改您的类。

      请注意,抽象基类允许相同类型的抽象,但在用法上有一些细微差别。

      【讨论】:

        猜你喜欢
        • 2017-04-15
        • 2013-10-19
        • 1970-01-01
        • 2010-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-10
        • 2022-01-02
        相关资源
        最近更新 更多