Java继承歧义?

时间:2017-07-30 03:54:03

标签: java inheritance multiple-inheritance

我在接受采访时被问到这个问题我找不到解决方案,所以我想把它带给你们。 我们在接口i中有方法。只考虑方法1。因此,我们编写方法1的代码,并在所有三个A,B和B类中重复使用它。 C.我们对X,Y& Z.所以我想让不同的D类来定义method1并在其下面编写代码,但是D不能扩展到A,B& C因为它们延伸了X,Y和ž

有什么建议吗? 注意:如果我们使用的是专门的JDK 1.6

font-weight: bold

修改 无法更改namespace App\Models; use Moloquent; use Carbon\Carbon; class Seat extends Moloquent { protected $collection = 'seat'; protected $connection = 'mongodb'; } interface i { method1(); method2(); } class A extends x class B extends y class c extends z` x类。

3 个答案:

答案 0 :(得分:1)

这没有错:

class A extends x implements i {

}

见:

Generic class that extends class and implements interface

<小时/> 另一方面,如果你真的想要A,B和C共享的代码(不仅仅是函数原型),那么X,Y和Z应该从类Parent扩展(X,Y和Z)必须从类Parent派生。

然后method1可以在Parent中定义,而不是在x,y和z中定义。

答案 1 :(得分:1)

问题不是100%明确,所以我将尝试回答这个并解释我的解释。如果解释错误,请告诉我,以便我指出正确的方向:

首先,您说所有课程都需要method1()。假设还需要method2(),则ABC类需要implement此接口。

您的代码将如下所示:

class A extends x implements i { ... }
class B extends y implements i { ... }
class C extends z implements i { ... }

如果在method1()AB类中需要C的相同实现,那么我建议使用抽象类,因此{{1看起来像是:

i

因为Java只允许一个超类abstract class i { method1() { // implementation here } abstract method2(); } xy,所以需要扩展z,从而使i,{{ 1}}和A看起来像:

B

修改

Cclass A extends x class B extends y class C extends z x需要如下所示:

y

如果method2()只需要一个实现,请执行以下操作:

z

编辑2:

在不编辑课程class x extends i { // implement method2 here } class y extends i { // implement method2 here } class z extends i { // implement method2 here } class i { method1() { // implement here } method2() { // implement here } } class x extends i {} class y extends i {} class z extends i {} x的情况下,Stephen C发布了一个非常好的解决方案:

y

答案 2 :(得分:1)

如果没有要求共享代码:

public class A extends X implements I {
    ... // implement method1 here, or inherit it from X
}

如果您需要共享代码,有三种可能的方法:

  1. implements I添加到相关类,并将X等更改为extend实现method1()的基类; e.g。

      public class A extends X implements I{ ...
      public class X extends Q { ... }
      public abstract class Q implements I { ... /* implement method1() */ }
    
  2. 使用委托; e.g。

      public class A extends X implements I {
          private I eye = // something that implements the I API
    
          public void method1() {
              eye.method1();
          }
      }
    
  3. 在Java 8及更高版本中,将method1()的实现作为I方法放入接口default。此不会与Java 6 1 一起使用。

  4. 这些方法都不适用于所有情况。如果它们都不起作用(并且没有其他选择)那么您需要复制代码。

    1 - 但另一方面,我会考虑为编码器工作,他们被困在Java 6上。这表明他们在管理事物的方式上有“问题”......可能会让Java开发人员的生活变得不愉快。 (无论如何,面试官为什么会说出这种限制。他们当然希望招募能够应对现代Java以及古代Java的人。)