[英]Questions on classes extending from a base class (Java)
我是Java的初學者,試圖為我正在編寫的游戲編寫一個派對任務系統,我有幾個問題我想回答。 我已經四處走動並問其他人,但他們對Java並不熟悉。
在過去,我嘗試制作一堆類並使用多個get方法訪問它們。 我發現寫作非常乏味,並認為我可以在抽象類/實現類下統一它們。 因此,代碼看起來更像是......
DynastyPQInterface pq = new CustomPQ // or ....
DynastyPQInterface pq = new OtherCustomPQ
當然,這帶來了諸如僅能夠使用實現的方法之類的困難。 它不允許我訪問我以后可能想要使用的類的獨占方法。
最終,我想要做的是能夠使用單個get方法返回任何這些派生類,但仍然保留了普遍使用get方法來調用它們共有的方法的能力,例如execute,創造,結束 ,同時允許我專門接觸他們的獨家方法。 有辦法做到這一點,還是不可能?
如果還不清楚......
我現在編寫的代碼是一個基類,以這種方式擴展到其他類...
DynastyPQ (base) -> methods include (run(), execute(), end())
CustomAPQ (inherited from DynastyPQ) -> (has exclusive methods like getPoints())
CustomBPQ (inherited from DynastyPQ) -> (has exclusive methods like revivePlayer())
我想寫一個get方法,以擺脫多重。 我現在擁有的是......
DynastyPQ dynastyPQ;
DynastyPQ getPQ() {
return dynastyPQ;
}
void setPQ(DynastyPQ pq) {
dynastyPQ = pq;
}
這樣做......
DynastyPQ pq = new CarnivalPQ();
我只能訪問DynastyPQ的方法而不是嘉年華的方法。
有沒有辦法訪問獨有的方法,同時普遍能夠執行四個基本函數而不考慮類的類型,或者我是否先前錯過了什么?
tl; dr - >我想要一個get方法,它通用地返回從類X繼承的所有類; 但是,我希望能夠訪問每個類的獨占方法。
您可以將對象強制轉換為派生類:
DynastyPQ pq = new CustomAPQ();
((CustomAPQ)pq).customAPQmethod();
如果您不知道動態類型是什么(在new運算符之后使用的類型),則可以使用instanceof關鍵字:
DynastyPQ pq = getPQ();
if (pq instanceof CustomAPQ) {
CustomAPQ a = (CustomAPQ)pq;
a.customAPQmethod();
} else if (pq instanceof CustomBPQ) {
CustomBPQ b = (CustomBPQ)pq;
b.customBPQmethod();
} else {
// Neither a CustomAPQ nor a CustomBPQ.
}
如果您不想這樣做,可以使用多態:
class DynastyPQ {
final void run() {
// code.
}
final void execute() {
// code.
}
final void create() {
// code.
}
void specific1() {}
void specific2() {}
}
class CustomAPQ extends DynastyPQ {
@Override
void specific1() {
// do stuff specific to CustomAPQ.
}
@Override
void specific2() {
// do stuff specific to CustomAPQ.
}
}
class CustomBPQ extends DynastyPQ {
@Override
void specific1() {
// do stuff specific to CustomBPQ.
}
@Override
void specific2() {
// do stuff specific to CustomBPQ.
}
}
現在,您可以:
DynastyPQ pq = new CustomAPQ();
pq.specific1();
被調用的方法是CustomAPQ::specific1()
。 如果未在CustomAPQ
聲明specific1()
,則它將不執行任何操作。
除了@CelineNOEL之外,建議不可能。 因為您聲明了一個類型為DynastyPQ的類,所以只能調用該類中定義的方法。 在您想要調用特定方法而不是共享方法的那一刻,您知道它來自哪個類,您可以使用強制轉換來調用該特定方法。
((CustomAPQ)pq).customAPQmethod()
您在代碼中使用的共享方法,當您不知道哪個類應該執行相同的代碼安靜時(或者如果您覆蓋每個子類中的共享方法,您希望它執行它不同),並委派它來解決它在運行時。 因此,重新考慮您的設計和基類中需要動態調用的方法。 您確定的所有其他方法都特定於僅在該類中放置的一個類。 通過這種方式,您的代碼將更加清潔,您不會混淆應該分開的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.