簡體   English   中英

關於從基類擴展的類的問題(Java)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM