当前位置 博文首页 > 庆述倾述:Java父类中调用子类的方法

    庆述倾述:Java父类中调用子类的方法

    作者:[db:作者] 时间:2021-08-05 12:49

    1. 接口和继承
    public interface In {
        void doSomething();
    }
    

    父类:

    public class T{
        private In in;
    
        public void setIn(In in){
            this.in = in;
        }
    
        // 需要子类重写的普通方法
        protected void layoutChildren() {
        }
    
        public void Hello(){
        	// 用子类对象,会调用子类实现方法
            layoutChildren();
            // 调用接口方法
            in.doSomething();
        }
    
    }
    

    子类:

    public class CT extends T implements In {
    
        @Override
        protected void layoutChildren() {
            System.out.println("HAHAHA");
        }
    
        @Override
        public void doSomething() {
            System.out.println("Do Something.");
        }
    
        @Test
        public void getT(){
            setIn(this);
            Hello();
        }
    }
    

    结果:
    在这里插入图片描述

    1. 即常规做法,讲子类对象直接传进去,但没人这么写代码;
    2. 将父类需要调用的方法,在子类中写为public static,但更加离谱,因为父类不关心子类,不应该知道子类的类名,更不应该知道子类的方法。
    3. 既然可以父类通过类名来调用静态,那么也就可以使用反射的方式。但还是很离谱,原因同上。

    所以一般而言使用为上面的两种方式,注意到在父类中的layoutChildren方法我们没有实现,可以申明为抽象方法,即:

    public abstract class T{
        private In in;
    
        public void setIn(In in){
            this.in = in;
        }
    
        // 需要子类重写
        protected abstract void layoutChildren();
    
        public void Hello(){
            layoutChildren();
            in.doSomething();
        }
    }
    

    那么,我们父类在调用layoutChildren方法的时候,就是调用子类的实现,但具体是哪个子类的实现,其实父类并不关心。接口也是如此的思想。也就是:

    • 行为由父类/接口控制,子类实现。

    当然上面代码的接口方式我感觉写的不好,感觉可以尝试使用SpringDI方式。

    cs