【问题标题】:How interfaces in java used for code reuse? [closed]java中的接口如何用于代码重用? [关闭]
【发布时间】:2017-09-17 07:41:36
【问题描述】:

我正在学习java,并且知道Java不支持多重继承。因此,java为此引入了接口。多继承问题是如何通过接口解决的?

我在网上看到的:“Java 中的继承意味着代码重用”。

如果我在 A 类中实现一个接口,我将不得不在 A 中为它提供我自己的实现,在 B 中也是如此,这意味着接口中的方法(比如我)将在 A 和 B 中具有不同的实现。如何是否使用了代码重用功能?

【问题讨论】:

  • 我知道接口是如何工作的,但不知道它是如何解决多重继承问题的
  • 是什么让您认为确实解决了这些问题?你从哪里得到它的想法?提示:如果你能给我们一些引用,我们可以(也许)弄清楚它(你正在阅读的文本)实际上在说什么,并向你解释。
  • 我提到的每个网站都说在java中可以通过接口实现多重继承,那么,继承不就是代码的可复用性吗?
  • “我提到的每个网站都说在java中,可以通过接口实现多重继承” 这不是一个有效的引用! “所以继承不意味着代码可重用性” 不!你在哪里读到的?请引用!

标签: java interface multiple-inheritance


【解决方案1】:

您在问题中所做的任何断言都没有给出适当的引用,因此不可能知道他们实际上在说什么......或者为什么你认为他们是说出这些不正确或误导性的话。


我正在学习java,并且知道Java不支持多重继承。

没错。

因此,java 为此引入了接口。

这是不正确的。 Java 引入了接口来支持多态性。特别是不依赖于类继承的多态性。

接口是如何解决多继承问题的?

不是。

多重继承是关于从多个父继承方法和字段声明。接口没有提供,也没有解决问题。

接口确实允许您声明一个通用 API(或 APIS)并实现该 API,而无需必要共享代码。但是通过精心设计,您可以在后台进行代码共享;例如通过使用委托设计模式。

我在网上看到的:“Java 中的继承意味着代码重用”。

我怀疑它实际上说的是什么。无论如何,这是不正确的。

(类的)继承是实现代码重用的一种方式,但它只是实现重用的众多方式之一。还有很多其他的。

如果我在 A 类中实现了一个接口,我将不得不在 A 中为它提供自己的实现,在 B 中也一样,这意味着接口中的方法(比如我)将在 A 和 B 中具有不同的实现。

我猜你的意思是这样的:

public interface I {
    void someMethod();
}

public class A implements I {
    void someMethod() {
         // some code
    }
}

public class B implements I {
    void someMethod() {
         // some code
    }
}

它如何使用代码重用功能?

该示例中没有代码重用。但这不是类的继承(我将其描述为实现代码重用的一种方式)。它是一个实现接口的类。

(现在在 Java 8 中,您可以在某些情况下将 代码 放入接口中;阅读 默认方法 功能。这确实允许 直接通过interface重用代码。但我怀疑这就是你一直在寻找的来源。)

【讨论】:

    【解决方案2】:

    Java 通过允许单继承(即只允许一个超类)解决了多继承问题(或者更确切地说是该特性带来的问题)。这种设计产生了一个类需要实现多个契约的新问题。合同,就像@Kermi 的回答中所解释的那样,允许其他对象将相同的对象引用为不同的类型,出于各种目的,最常见的是用于存储在Collections 中。接口可以看作是没有实现的超类(所有方法都是纯虚的,如果你喜欢的话)

    因此,Java 消除了多重继承带来的问题(著名的菱形问题),但也消除了它带来的优势,例如代码可重用性。这种设计遵循通过删除“高级”(有人说是令人困惑的)C++ 特性(如多重继承、运算符重载、指针操作等)使 Java 变得简单、容易和可预测的原则。

    有几种技术可以让 Java 恢复多继承的大部分代码可重用性。 composition 就是这样一种技术:因此,如果我们以@Kermi 为例,您可以拥有一个实现Animal 最常见行为的GeneralAnimal 类。每个Dog 实例都包含对GeneralAnimal 实例的引用(通过ctor 或工厂或依赖注入或...获得),并且可以将一些消息(=方法调用)委托给该实例。在Cat 实例等中也是如此。

    【讨论】:

      【解决方案3】:

      接口不能解决多重继承问题,或者说它不会产生多重继承问题。它使您可以重用现有的实现。 例如:

      class Dog implements Comparable<Dog>, Animal
      

      由于您的类实现了 2 个接口,您可以以不同的方式使用它们。要使用 TreeSet 对象需要实现 Comparable 方法(这不是唯一的可能性)。当 Dog 被传递给 TreeSet 时,该结构的实现确定该对象具有 compareTo(Dog dog) 方法并且可以使用它。 但是,如果您想存储一个动物列表,并且使用为 Animal 声明的执行方法遍历该列表,那么您不会使用 Comparable 接口,而是使用 Animal。

      List<Animals> animals = new ArrayList<>();
      animals.add(dog);
      animals.add(cat);
      for (Animal animal : animals) {
          animal.walk();
      }
      

      【讨论】:

        【解决方案4】:

        我认为,界面是一个标准。 A和B应该符合它。此外,A 和 B 做不同的事情,例如 ArrayList 和 LinkedList。 “Java 中的继承意味着代码重用”是对的,但接口不是。它体现了一种规范。 学了Collection,你就明白了。

        【讨论】:

          猜你喜欢
          • 2013-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-02
          • 2018-10-18
          • 1970-01-01
          • 2017-09-25
          相关资源
          最近更新 更多