如何用自定义内容扩展超类的方法



我正在寻找如何用自定义内容扩展超类方法的解决方案。

例如,我有一个超高级

class A{
  public  A(){
    boolean ok = doSomeInitialWork();
    if(ok){
        specialMehtod();
    }
  }
  specialMehtod(){
     System.out.print("HEllO");
  }
}

所以我的类A做了一些"初始化"的事情,然后调用specialMehtod()。现在我想要class B extends A,并向specialMehto()添加一些其他代码。类似于:

Class B extends A{
    B(){
        super();
    }
    specialMehtod(){
       System.out.print("BBBBB");      
    }
}

但如果我这样做,我会调用a.SpecialMethod() expizit,实际上我只想将System.out.print("BBBBB");"添加"到specialMethod()中,这样它仍然可以从A.的构造函数中调用

我想实现的是,最终我可以在我的主要课程中完成

new B();

蚂蚁的输出将是。HELLO BBBBB 因为B()调用了A()的构造函数,后者调用了由B.specialMethod()扩展的A.specialMethod()

有可能吗?

感谢

你必须这样做:

public abstract class A{
    public abstract void anotherMethod();
    public A(){
        // some stuff..
        specialMethod();
    }
    private final void specialMethod(){
        System.out.println("specialMethod");
        anotherMethod();
    }
}
public class B extends A{
     public B(){
         super();
     }
     public void anotherMethod(){
         System.out.println("anotherMethod");
     }
}

通过这种方式,您可以强制扩展类实现方法anotherMethod(),并且该方法是从抽象类A中调用的。如果扩展类不需要在anotherMethod()中做任何事情,那么可以让方法体为空。


正如您问题的注释中所提到的,您必须继承或重写该方法。在重写方法时,必须显式调用超级方法super.someMethod();,或者在继承时,不能向给定方法添加额外的功能
因此,在您的示例中,如果您不在B中实现specialMethod(),它将打印出"HELLO",因为A有该方法的实现,但B没有。如果像在类B:中的示例中那样重写方法

specialMethod(){
    System.out.println("BBBBB");
}

它的效果是不会打印出"HELLO"。在这种情况下,A的构造函数将直接调用B.specialMethod()(在B对象的实例上)。如果你不想调用A.specialMethod(),你必须显式调用它。所以,不,如果不显式调用super.specialMethod(),你就不能向在超类中实现的方法"添加功能"。

出于这个原因,我构建了上面的示例作为一种变通方法。请注意,我已经更新了代码。在这个例子中,如果您调用new B();,输出将是:

specialMethod
anotherMethod

使用这种变通方法,扩展类不必显式调用super.specialMethod(),但必须实现anotherMethod()。此外,通过使specialMethod成为final方法,不允许B覆盖specialMethod

A中使用abstract方法。像这样-

public class A{
   public abstract specialMethod();
}  

然后,当B扩展A时,B必须自己实现specialMethod()

最新更新