繁体   English   中英

类构造函数中的抽象方法

[英]Abstract method in the class constructor

我想实现一个抽象 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();
    }

谢谢你。 ------------------------------ 编辑 ----------

好的,在构造函数中调用抽象方法是错误的。 那么,我该怎么做才能强制继承类进行具体的构造函数实现(例如,以一种或另一种方式初始化成员?)

我想实现一个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();
    }

谢谢你。 ------------------------------编辑----------

好的,在构造函数中调用抽象方法是错误的。 因此,我该怎么做才能强制继承类以实现具体的构造函数实现(例如,以一种或另一种方式初始化成员?)

您将到达基类构造函数并从该构造函数返回,在子类构造函数中,所有字段初始化都将发生,其余代码形成子构造函数。

为了确保调用某个方法,您可以稍后延迟调用该方法。 或者传递一个独立的对象,作为整个孩子的“一部分”。

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

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

public Base(Part part) { ... }

也可能有这样的情况

  • 提供的服务(公开决赛)
  • 要求已实现(抽象保护)

所以:

class Base {

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

     protected void onFoo() {
         throw new IllegalStateException("Missing onFoo implementation "
             + getClass().getName());
     }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM