覆盖派生类中的基类方法

a3d*_*fcv 0 java inheritance

我有一个基类A,有一个方法"说"从A的构造函数调用.所有可遗漏的类使用方法"说"就像它.但其中一个类需要重新定义这种方法.这怎么可能?

当然,我可以将基本方法"说"视为抽象,但是这样,我必须在所有可遗漏的类中复制相同的方法"说".

如果我只是重新定义方法而不将基数表示为抽象,那么它就不会被调用.

public abstract class A(){
     public A(){
        say();  //  <- wanna call this method from heritable class, if its redefined. 
     }
     protected void say(){};
}

public class B extends A(){
     public B(){
        super();
     }
     private void say(){};
}
Run Code Online (Sandbox Code Playgroud)

重构1

public abstract class A(){
     public A(){
       //  constructor methods             
     }
     protected void say(){};
     protected void executeSay(){
       say();
     }
}

public class B extends A(){
     public B(){
        super();
        executeSay();
     }
     @Override
     protected void say(){};
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*nik 11

首先必须弄清楚:从构造函数调用可覆盖的方法是一个众所周知的反模式.它几乎肯定会破坏你的代码,因为在子类构造函数完成之前将调用子类方法,因此将观察未初始化的对象.因此,我最好不要向您提供有关实现此反模式的Java技术的详细建议.

完成你的要求的唯一安全方法是让结构完成,然后才调用一种initialize方法.如果要initialize始终确保调用,请使构造函数非公共,并提供工厂方法.

遗憾的是,Java需要您做一些工作才能使其正常工作.