是否有可能让一个班级有多个超类?

时间:2014-04-21 23:23:45

标签: java swing inheritance subclass superclass

我正在使用Swing为我的高中编程课创建一个非常原始的二十一点游戏,因此,我的所有资源类都扩展了JPanel。我创建了以下资源类:

  • DealerBox
  • ClubsBox
  • SpadesBox
  • HeartsBox

我的问题是我想创建一些公共整数,以便我有

public int DealerTotal, ClubsTotal, SpadesTotal, HeartsTotal;

我想这样做,这样我就可以追踪每个人的价值观并确定赢家和输家。我有一个灯泡响了,并认为让Dealerbox成为Clubs,Spades和Hearts的超级类是我所有麻烦的解决方案,因为我可以让超类中的简单代码获取上述整数的值并执行我需要的所有检查。

所以我为我的一个子类写了这个:

public class ClubsBox extends JPanel, DealerBox implements Runnable
{
//fun code 
}

现在的问题是我不断收到错误。我认为它与将ClubsBox列为JPanel和DealerBox的子类有关。所以我stackoverflowed我的问题,并找到一个答案,声明一个人不能有一个有2个超类的类。对类似问题的另一个答案是,一个COULD有一个有两个超类的类。

现在我们回到主要问题:是否有可能拥有一个有两个超类的类?如果是这样,我该如何编码呢?如果没有,是否有办法绕过限制?

编辑:2014年4月21日,原始发布后44分钟

我有一个新问题。我使用了每个人都建议的方法,即让DealerBox扩展JPanel然后让其他所有东西扩展DealerBox。我的GUI来自于: GUI before chaining

To This:

GUI after chaining 底部显然非常难以搞砸。不知何故,来自其他地区的标签最终被复制,并且东西混杂在一起。如果你需要代码让我知道,但我需要认真帮助解决这个问题。

请记住继承树如下所示:

InhertianceTree

6 个答案:

答案 0 :(得分:7)

不幸的是,您在Java中不能拥有多个直接超类。但是你可以把它们连在一起:

public class DealerBox extends JPanel
public class ClubsBox extends DealerBox

现在,由于新版本的组件未按照以前的方式布局,因此很难在没有看到某些代码的情况下猜测发生了什么。您是否将公共代码放入DealerBox的构造函数中,并从每个DealerBox子类调用它?像这样:

public class DealerBox extends JPanel {
    public DealerBox(String info) {
        super(); // JPanel constructor
        doSomething();
    }
}

public class ClubsBox extends DealerBox {
    public ClubsBox() {
        super("Clubs"); // DealerBox constructor
    }
}

答案 1 :(得分:3)

当Sun设计Java时,它故意省略了多重继承 - 或者更确切地说是多次实现继承。然而,多重继承可能是有用的,特别是当一个类的潜在祖先具有正交关注点时。本文介绍了一个实用程序类,它不仅允许模拟多重继承,还具有其他深远的应用程序。

你有没有发现自己想写类似的东西:

public class Employee extends Person, Employment {
// detail omitted
}

在这里,人是一个代表一个人的具体阶级,而就业是另一个具体的阶级,代表一个受雇者的细节。如果你只能将它们组合在一起,那么你将拥有定义和实现Employee类所需的一切。除了Java之外 - 你不能。从多个超类继承实现 - 多个实现继承 - 不是该语言的一个特性。 Java允许一个类只有一个超类,而不是更多。

有关更多信息,请阅读http://www2.sys-con.com/itsg/virtualcd/java/archives/0810/haywood/index.html

一个选项是"继承继承":

public class Person extends Employee
public class Employee extends Employment

干杯。

答案 2 :(得分:2)

Java中不允许多重继承。所以你不能有两个超类。

解决这个问题的方法是让ClubsBox只扩展DealerBox,然后DealerBox本身扩展JPanel。

ClubsBox:

public class ClubsBox extends DealerBox implements Runnable {

}

DealerBox:

public class DealerBox extends JPanel {

}

答案 3 :(得分:2)

Java中的

只能扩展一个类,您尝试扩展两个类。他们能;但是,实现多个interfaces

你可以有多重继承,如下所示:

Class Integer extends Number ...
Class BigInteger extends Integer ...
Class ReallyBigInteger extends BigInteger ...

依旧等等,这有帮助吗?

答案 4 :(得分:0)

没有Java不允许您拥有一个以上的Super类或继承一个以上的Parent类。这个概念称为多重继承。背后的原因是钻石问题,需要更多地了解多重继承和钻石问题检查:https://www.geeksforgeeks.org/java-and-multiple-inheritance/

答案 5 :(得分:0)

在Java中,一个子类不能具有多个父类。但是您想要的是可以实现的,您可以创建一个包,并在该包中包含类。在当前类所在的包中,您必须导入该包。但是请记住,您必须保留“ public”作为访问说明符。