繁体   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