2014-04-21 116 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 ... 

等等等等,這是否幫助?

相關問題