一个类是否可以有多个父类?

4

我正在用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的子类有关。因此,我在stackoverflow上查找了我的问题,并找到了一个答案,它说明不能有一个具有2个超类的类。对于类似问题的另一个答案表明,可以有一个具有两个超类的类。
现在我们来到主要问题:是否可能有一个具有两个超类的类?如果是这样,我该如何编码它?如果不行,有没有绕过限制的方法?
编辑:2014年4月21日,原帖发表后44分钟
我有一个新问题。我使用了所有人建议的方法,即使DealerBox扩展JPanel然后使其他所有内容扩展DealerBox。我的GUI由此变成了这个:GUI before chaining 到这个:
底部的显然非常混乱。某种程度上,其他区域的标签被复制,东西被混合在一起。如果需要代码,请让我知道,但我需要严重的帮助来解决这个问题。
请记住,继承树看起来像这样:InhertianceTree

你可以使用 A extends B,然后 B extends C,但不能按照你所写的方式。 - AntonH
Java只支持单一类继承,但可以有零个或多个实现的接口。参见Oracle Java继承教程 - Richard Chambers
Java没有包含多重继承,因为在使用多重继承时,类层次结构可能会变得非常复杂(请参见为什么Java中没有多重继承)。我还想指出,继承可能被过度使用,在一般情况下,组合优于继承。 - Richard Chambers
你们所有人都提供了很好的帮助并基本上给出了相同的答案,非常感谢你们。 - Ungeheuer
我已经尝试猜测您新发现的第二个问题可能是什么-如果问题没有解决,请考虑提出一个新问题,可以更深入地探讨布局问题,并粘贴一些代码。 - SimonT
@SimonT 我不确定问题出在哪里,但是由于我的项目已经晚交2个班次了,我没有时间弄清楚是什么问题。等我跟上课程之后,我会再发布另一个问题并在这里留言。 - Ungeheuer
6个回答

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
    }
}

4

引用

在设计Java时,Sun有意省略了多重继承 - 更准确地说是多重实现继承。然而,多重继承可能很有用,特别是当一个类的潜在祖先具有正交关注点时。本文介绍了一个实用程序类,不仅允许模拟多重继承,而且还具有其他深远的应用。 你是否曾经想过写出类似于以下内容的东西:

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

在这里,Person是表示人的具体类,而Employment是表示雇用人员详细信息的另一个具体类。如果你能将它们结合起来,就可以拥有定义和实现Employee类所需的一切。但在Java中不行 - 你不能这样做。从多个超类继承实现 - 多重实现继承 - 不是该语言的特性。Java允许一个类只有一个超类,没有更多。

你的一个选择是“继承自继承”:

public class Person extends Employee
public class Employee extends Employment

从相关的好文章中复制是可以的,但请至少链接到您复制的文章... http://www2.sys-con.com/itsg/virtualcd/java/archives/0810/haywood/index.html - JonK

2

Java不允许多重继承,因此您不能有两个超类。

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

ClubsBox:

public class ClubsBox extends DealerBox implements Runnable {

}

DealerBox:

public class DealerBox extends JPanel {

}

2

Java中的类只能继承一个类,您试图继承两个类。但是,它们可以实现多个接口。

尽管如此,您可以使用多重继承,例如:

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

以及诸如此类的内容,这有所帮助吗?

0

0
在Java中,子类不能有多于一个的父类。但是你想要的是可以实现的,你可以创建一个包,在该包中有类。并且在当前类所在的包中,你必须导入该包。但是请记住,你必须将“public”作为访问修饰符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接