【问题标题】:What is the advantage/point of using Interfaces in Java? [duplicate]在 Java 中使用接口的优点/要点是什么? [复制]
【发布时间】:2020-06-01 16:36:32
【问题描述】:

我是 Java 的新手,我已经读到了教科书中关于接口的章节。但是,我看不到它们的用途/意义。我敢肯定它们并不是没用的,只是我不理解这个主题。

所以,接口就像抽象类,它们只命名方法,而不是它们的实现。书中提供的第一个示例讨论了class Shapeextended class rectangle,其想法是允许一种方法将矩形的最大边拉伸。于是代码开始:

public interface Stretchable {
    void stretch( double factor );
{

然后他们描述了使用它的“点”

public class Rectangle extends Shape implements Stretchable
{
   public void stretch( double factor )
   {
      if( factor <0 )
      throw new IllegalArgumentException();

      if( length > width )
          length *= factor;
      else
          width*= factor;
   }
}

但是,通过定义和实现一个接口,我看不到我在那里赢得了什么。接口只是void stretch( double factor);,我仍然必须在Rectangle 类中定义相同的东西。当我仍然必须从头开始定义接口的方法将在实现它的类中做什么时,这样做有什么好处?

【问题讨论】:

  • 如果其他东西也可以拉伸怎么办?如果合作者可以在任何可伸缩的东西上进行操作并且不想依赖特定的实现怎么办?另请参阅the questions linked to the proposed dupethis cross-site question 以及任何关于强类型语言的体面介绍。
  • 将其称为“合同”,对您来说可能更有意义。
  • 对于初学者来说,Java 不允许多重继承(基本上是因为diamond problem)所以你不能扩展多个类。您可以根据需要实现任意数量的接口,而不会出现此类问题。
  • 接口对 Java 很有价值,因为它们允许开发人员独立于其实现来指定 API。例如。 Java Collections Framework 中的Collection 接口指定了许多实现它的类所使用的API:HashSetArrayListTreeSetSortedSet 等。

标签: java oop generics inheritance interface


【解决方案1】:

因为您为所有类定义了一个共同的行为,可以拉伸 (Stretchable)。假设你有一个Circle

public class Circle extends Shape implements Stretchable
{
   public void stretch( double factor )
   {
      this.radius = this.radius * factor;
   }
}

现在如果你可以拥有所有东西的集合,那是可以拉伸的,因为有一个通用接口:

List<Stretchable> stretchables = List.of(new Circle(1), new Rectangle(1, 2));

由于都是Stretchable,你可以在所有对象上调用该方法:

stretchables.forEach(stretchable -> stretchable.stretch(2));

【讨论】:

  • 但是我仍然必须定义 Stretch 对每个类做了什么,并且每个类的实现都不同,所以最后使用该接口(它只是命名一个方法)和只是将我的方法手动添加到我的扩展类中?最后,我从接口中得到的唯一东西就是方法的名称,我仍然必须从头开始编写。
  • 这样你就可以调用最后两个sn-ps。没有接口会出现编译错误。
猜你喜欢
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2015-09-01
  • 2021-06-27
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多