微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

防止方法调用使用子类的方法

如何解决防止方法调用使用子类的方法

| 我有一些原则上类似于以下内容内容
public class Generic {

    public Generic(){
        doStuff();
    }

    protected void doStuff(){
        System.out.println(\"Generic\");
    }

}

public class Specific extends Generic {

    public Specific(){
        super();
    }

    protected void doStuff(){
        super.doStuff();
        System.out.println(\"Specific\");
    }

}
我得到的错误表明,尽管该方法是从超类中调用的,但它是在调用方法的子类版本。在上面的示例中,实例化一个新的Specific会同时输出\“ Generic \”和\“ Specific \”,即使doStuff()已由Generic \的构造函数调用。 长话短说,我不要。如果在完全初始化对象之前调用子类,则该子类的方法中会添加一些功能,从而导致问题。我如何在超类的构造函数中强制其使用自己的方法版本,而不是最专门的方法?     

解决方法

像这样在您的Specific类中具有初始化的boolean标志如何:
public class Specific extends Generic {
    boolean initialized = false;
    public Specific(){
        super();
        initialized = true;
    }

    @Override
    protected void doStuff(){
        super.doStuff();
        if (!initialized) return;
        System.out.println(\"Specific\");
    }

    public static void main(String[] args) {
        @SuppressWarnings(\"unused\")
        Specific specific = new Specific();
    }
}
这只是调用Generic \的doStuff()方法,因为在构造父类而未完全构造子类时,初始化的标志为false。我认为这是为什么不希望调用Specific的重写方法的主要原因。     ,我不认为您可以在Java中拥有一个可以同时覆盖A)和B)在调用时都不会表现多态的函数。我建议您做这样的事情来模拟您要询问的行为:
public class Generic {

    public Generic(){
        doGenericStuff();
    }

    private final void doGenericStuff() {
        System.out.println(\"Generic\");
    }

    protected doStuff(){
        doGenericStuff();
    }

}

public class Specific extends Generic {

    public Specific(){
        super();
    }

    protected doStuff(){
        super.doStuff();
        System.out.println(\"Specific\");
    }

}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。