2

好的,我会把代码放在第一位,希望它更清楚。

***编辑:问题已解决,通过在创建序列时将序列实例传递给对话框,然后对话框具有要调用的内部引用。

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,它告诉我“无法从静态上下文引用非静态方法命中”。
整个事情在一个应用程序中运行,该应用程序根据游戏的上下文创建序列对象的实例,因此命中需要引用序列中的非静态对象。

4

3 回答 3

2

因为hit()不是静态方法,您需要访问其封闭实例RavelSequence才能调用它。

你可以通过使用this关键字 ifDialog是一个嵌套类来做到这一点:

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

否则,您将需要将实例传递RavelSequenceDialog实例。

于 2012-06-20T13:19:52.877 回答
2

您是 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();
    }
}
于 2012-06-20T13:24:15.500 回答
0

您需要一个 RavelSequence 实现的实例。因为 RavelSequence 是抽象的,所以不能直接实例化。

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

        if (somethingHappens)
            RavelSequence  ravel = new OutOfBattleSequence(); // we choose implementation
            ravel.hit();
    }
}
于 2012-06-20T13:23:21.870 回答