Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
489 views
in Technique[技术] by (71.8m points)

使用匿名类实例化了一个抽象类之后,如何重写其中的抽象方法并调用?

public abstract class Rhythm {

    /**
     * @return duration between {@linkplain Note} in milliseconds
     */
    public abstract long getDuration();

    public void perform() {
        long duration = getDuration();
        try {
            Thread.sleep(duration);
        } catch (InterruptedException ie) {
            Thread.currentThread().interrupt();
            throw new RuntimeException(ie);
        }
    }
}

--------------------------------------------------------------------

@Override public void play(Rhythm rhythm, Note note, NoteCallback noteCallback){
    rhythm.getDuration();//想在这里重写getDuration方法,如何做到?
    rhythm.perform();
    note.getNoteValue();
    noteCallback.notePlayed(note);
}

--------------------------------------------------------------------

//重写成如下形式
  @Override public long getDuration(){
      return (expectedMs);
   }

代码附上。在play() 方法中如何直接重写Rhythm类中的抽象方法getDuration()呢? 创建rhythm对象是可以用匿名类的方法实例化的,那是实例化之后 想调用一个重写的getDuration()方法,有什么办法么?在不引入子类继承的前提下。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

java不能怎么做,但能用内部类变相的实现这个需求

public abstract class Rhythm {

    /**
     * @return duration between {@linkplain Note} in milliseconds
     */
    public abstract long getDuration();
    
    public abstract class InnderClass {
        public abstract long getDuration();
    }

    private InnderClass innderClass;

    public Rhythm() {
        innderClass = new InnderClass() {
            @Override
            public long getDuration() {
                return Rhythm.this.getDuration();
            }
        };
    }

    public void setInnderClass(InnderClass innderClass) {
        this.innderClass = innderClass;
    }

    public void perform() {
        long duration = innderClass.getDuration();
        try {
            Thread.sleep(duration);
        } catch (InterruptedException ie) {
            Thread.currentThread().interrupt();
            throw new RuntimeException(ie);
        }
    }
}
@Override public void play(Rhythm rhythm, Note note, NoteCallback noteCallback){
        //rhythm.getDuration();//想在这里重写getDuration方法,如何做到?
        rhythm.setInnderClass(rhythm.new InnderClass() {
            
            @Override
            public long getDuration() {
                // TODO 把实现放到这里
                return 0;
            }
        });
        rhythm.perform();
        note.getNoteValue();
        noteCallback.notePlayed(note);
    }

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...