【问题标题】:To understand Multiple inheritance and interfaces了解多重继承和接口
【发布时间】:2012-06-10 04:52:45
【问题描述】:

我在一定程度上了解多重继承和接口。是否可以使用多重继承来实现我的要求?

我有分别实现接口 InterA、InterB、InterC、InterD 的 A、B、C、D 类。我想要一个类 ABCD,它应该具有 A、B、C、D 的所有方法。然后我想要在类 ABCD 中可用的 InterA、InterB、InterC、InterD 中声明的方法。

我已经在 A、B、C、D 类中定义了 InterA、InterB、InterC、InterD 中的方法实现,我不想在 ABCD 类中再次定义这些方法。我如何在 Java 中做到这一点?

【问题讨论】:

  • 为什么你想要ABCD?系统中的每个对象(在最广泛的意义上)都应该有一个单一的职责。让一个班级做其他 4 个班级所做的事情,违反了这一点……很多!
  • Java 中只能扩展一个类并实现多个接口。
  • 当然,Joachim 假设 A、B、C、D 是 getter/setter。我需要一个拥有所有 getter/setter 的类,所以我正在设计 ABCD 类,现在需要我在 ABCD 中重写代码。我相信我现在很清楚
  • 抱歉,目前还不清楚。你只是重复那个你想要ABCD,但没有解释为什么你需要它。显然ABCD 本身就是功能齐全的类(否则你不会编写它们)。那么,为什么您需要 一个 对象来完成所有这 4 项工作呢?

标签: java oop interface multiple-inheritance


【解决方案1】:

接口的目的是确保实现该接口的类将实现该接口中声明的所有方法。

例如:

public interface Flyer {

    public void fly();
}

上述接口确保任何实现 Flyer 接口的 Java 类都将具有 fly 方法的实现,而不管航班是如何实现的。

例如:

public class Bird implements Flyer {

    public void fly() {
        System.out.println("Bird is flapping");
    }
}

还有一个例子:

public class Eagle implements Flyer {

    public void fly() {
        System.out.println("Eagle is soaring");
    }
}

有了接口,我确信尽管实现不同,fly() 方法仍然存在。

因此,如果您想要一个具有 4 个不同接口行为的类 ABCD,如接口 A、B、C 和 D 中指定的,那么您可以实现:

public class ABCD implements A,B,C,D {

    // methods here
}

通常,我们使用接口来继承行为,使用父/子类来继承模型。

那么我们如何使用 Flyer 界面呢?

示例代码:

public class FlyerTest {

    public static void main (String [] args) {
        Flyer flyer = new Eagle();
        flyer.fly();    // Prints out "Eagle is soaring"

        flyer = new Bird();
        flyer.fly();    // Prints out "Bird is flapping"
    }

}

如你所见,只要我有一个 Flyer,我确信“fly”方法会有一个实现。这让我无需怀疑该方法是否真的存在。

这就是我们使用接口来继承行为的原因。

希望您对多重继承有更好的了解。

要回答您的核心问题,面向对象的编程通常有助于促进代码重用。

【讨论】:

    【解决方案2】:

    由于 Java 中没有多重继承,您必须求助于 聚合

    class ABCD implements InterA, InterB, InterC, InterD
    {
       A implA;
       B implB;
       C implC;
       D implD;
    
       ABCD(A pimplA, B pimplB, C pimplC, D pimplD)
       {
         implA = pimplA;
         implB = pimplB;
         implC = pimplC;
         implD = pimplD;
      }
    
    
      // @overidde methods from InterA as return implA ->method();
      // @overidde methods from InterB as return implB ->method();
      // @overidde methods from InterC as return implC ->method();
      // @overidde methods from InterD as return implD ->method();
    }
    

    这样你只需要创建一些 A、B、C 和 D 的实例,并在构建 ABCD 时传递它们。然后 ABCD 只需调用它们的方法

    通过这样做,您将重用 A、B、C 和 D 的实现

    【讨论】:

      【解决方案3】:

      在 java 中没有“真正的”多重继承。你不能做某事。喜欢public class D extends C,B,A {} 你所能做的就是实现多个接口或者你可以让B扩展A,C扩展B和D扩展C

      【讨论】:

        【解决方案4】:

        java 中没有多重继承。为什么不直接在 ABCD 中创建这些类的对象并使用它们来访问这些类的方法?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-12
          • 2017-03-24
          • 2013-12-06
          • 2013-10-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多