簡體   English   中英

抽象類的子類包含一個無法訪問抽象方法實現的對象

[英]subclasses of an abstract class contain an object which can't access an implementation of an abstract method

好的,我希望將代碼放在第一位,以使其更加清晰。

***編輯:通過創建序列時將序列的實例傳遞給對話框來解決問題,然后對話框具有要調用的內部引用。

public abstract class RavelSequence {
    protected Dialog dialog; //every subclass uses one of these objects
    public abstract void hit();
}

public class BattleSequence extends RavelSequence {
    public void init(){                //this is the edited fix
        dialog.setSequence(this);      //
    }                                  //

    public void hit(){ //the effect of a 'hit' in battle
        doSomething();
    } 
}

public class OutOfBattleSequence extends RavelSequence {
    public void init(){                //this is the edited fix
        dialog.setSequence(this);      //
    }                                  //

    public void hit(){ //the effect of a 'hit' outside battle
        doSomethingElse();
    }
}

public class Dialog extends Container implements Runnable {
    private RavelSequence sequence;                  //this is the edited fix
    public void run (){
        if (somethingHappens)
            sequence.hit();
    }
    public void setSequence (RavelSeqence sequence){ //this is the edited fix
        this.sequence = sequence;                    //
    }                                                //
}

我想讓Dialog能夠調用在擁有Dialog實例的任何類中實現的方法hit()。 我正在使用IntelliJ IDEA,它告訴我“無法從靜態上下文引用非靜態方法命中”。
整個過程在一個應用程序中運行,該應用程序根據游戲的上下文創建Sequence對象的實例,因此命中將需要引用Sequence中的非靜態對象。

由於hit()不是靜態方法,因此您需要訪問RavelSequence的封閉實例才能對其進行調用。

如果Dialog是一個嵌套類,則可以使用this關鍵字來實現:

public abstract class RavelSequence {
    public class Dialog extends Container implements Runnable {
        public void run (){
            RavelSequence.this.hit();
        }
    }
    public abstract void hit();
}

否則,您需要將RavelSequence一個實例RavelSequenceDialog實例中。

您是Dialog對象,不知道它屬於哪個RavelSequence。 因此,您嘗試做的事情不可能那樣做。 在對話框中包含RavelSequence,它將正常工作。

例如:

public class Dialog extends Container implements Runnable {
    protected RavelSequence sequence;

    public Dialog(RavelSequence sequence) {
        this.sequence = sequence; // or any other mean to set your RavelSequence: setter, dependency injection...
    }

    public void run (){
        if (somethingHappens)
            sequence.hit();
    }
}

您需要RavelSequence實現的實例。 由於RavelSequence是抽象的,因此無法直接實例化。

public class Dialog extends Container implements Runnable {
    public void run (){

        if (somethingHappens)
            RavelSequence  ravel = new OutOfBattleSequence(); // we choose implementation
            ravel.hit();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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