Абстрактный метод в конструкторе класса - PullRequest
0 голосов
/ 05 марта 2020

Я хочу реализовать класс Abstract Java. Один из абстрактных методов должен быть реализован каждым дочерним классом, чтобы гарантировать, что эта часть кода будет выполняться индивидуально в каждом дочернем классе. Есть ли другой способ сделать это и, таким образом, избежать «предупреждения», которое появляется при вызове абстрактного метода из конструктора основного класса?

    public abstract class Listener {

    protected Date checkTime = new Date();
    protected TypeUpdate type = UNKNOW;

    public Listener(){
        super();
        this.setTypeListener();
    }

    public void setTime(Date date) {
        if (date != null) {
            return;
        }
        this.checkTime = date;
    }

    /* Abstract methods */
    public abstract void execute();

    protected abstract void setTypeListener();
    }

Спасибо. ------------------------------ EDITED ----------

Хорошо, это Ошибка вызова абстрактного метода в конструкторе. Итак, что я могу сделать, чтобы заставить наследуемые классы создать конкретную реализацию конструктора (например, инициализировать член тем или иным способом?)

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Вы прибываете в конструктор базового класса и, вернувшись из этого конструктора, в конструкторе дочернего класса произойдут все инициализации поля, а оставшийся код образует дочерний конструктор.

Чтобы обеспечить вызов некоторого метода Вы можете либо вызвать этот метод лениво позже. Или передайте независимый объект, как «часть» всего потомка.

public Child() {
    super(createPart());
}

private static Part createPart() {
    return new Part().withAnswer(42);
}

public Base(Part part) { ... }

Можно также предложить вариант обслуживания

  • (publi c окончательный вариант)
  • требование выполнено (защищено)

Итак:

class Base {

     public final void foo() {
         onFoo();
     }

     protected void onFoo() {
         throw new IllegalStateException("Missing onFoo implementation "
             + getClass().getName());
     }
}
0 голосов
/ 05 марта 2020

Вы можете сделать что-то вроде

class Hello {
    private String message;

    Hello(String message) {
        this.message = message;
    }
}

public class Main {
    public static void main(String args[]) {
        // Hello hello=new Hello(); //Not possible
        Hello hello = new Hello("Hello"); // Forced to specify the value for message
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...