2014-04-21 104 views
3

我正在使用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个超类。对类似问题的另一个答案是,一个可以有一个类有两个超类。

现在我们来回答主要问题:是否有可能拥有一个拥有两个超类的类?如果是这样,我该如何编码?如果没有,是否有解决方法?

编辑:2014年4月21日,后原帖

我有一个新的问题44分。我使用了大家所建议的方法,即让DealerBox扩展JPanel,然后让其他所有扩展DealerBox。我的GUI从这个去: GUI before chaining

这样:

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

请记住继承树是这个样子:

InhertianceTree

+0

你可以有'A扩展B',然后'B扩展C',但不是你写它的方式。 – AntonH

+0

Java仅支持单个类继承,但您可以有零个或多个实现的接口。请参见[Oracle Java继承教程](http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html) –

+0

由于使用类层次结构可能会发生的复杂性,因此Java不包含多重继承使用多重继承(请参阅[为什么在Java中没有多重继承](http://stackoverflow.com/questions/2515477/why-there-is-no-multiple-inheritance-in-java-but-implementing-multiple- interfac))。我也想指出,继承可以被过度使用,并且通常组合优于继承。 –

回答

3

当太阳被设计的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 

干杯。

+0

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

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

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

解决此问题的方法是将ClubsBox仅扩展DealerBox,然后DealerBox本身扩展JPanel。

ClubsBox:

public class ClubsBox extends DealerBox implements Runnable { 

} 

DealerBox:

public class DealerBox extends JPanel { 

} 
2

在Java中只能继承一个类,你想扩展两个。他们能;然而,实施多个interfaces

你可以有多重继承不过,这样的事情:

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

等等等等,这是否帮助?

相关问题