【问题标题】:non-abstract method calling abstract method非抽象方法调用抽象方法
【发布时间】:2021-10-13 01:46:09
【问题描述】:

我怀疑抽象类中的非抽象方法是否可以在内部调用抽象方法?

例如:

abstract class Car {
    abstract void startEngine();

    abstract void startRadiator();

    void start(String type) {
     if (type.equals("Engine")) {
          startEngine();
     else {
          startRadiator();
     }

}


class Maruti extends Car {
    void startEngine(){
        System.out.println("Starting the engine::");
    }

    void startRadiator(){
        System.out.println("Starting the Radiator::");
    }
}


public class Main {
    public static void main(String args[]) {
        Car c = new Maruti();
        c.start("Engine");
    }
}

这是允许的吗?答案是正确的,但想了解这是否是正确的设计,我们将来不会遇到任何设计问题吗?

【问题讨论】:

  • 是的,这是允许的。该类只有在基于抽象父类的具体子类时才会被实例化,因此抽象方法在调用时保证是非抽象的。
  • 但是,看起来子类方法是从父类调用的?不是吗?
  • 远非明确禁止,这是一种已知的设计模式:en.wikipedia.org/wiki/Template_method_pattern
  • 这种模式解释很有帮助。谢谢!

标签: java oop inheritance abstract-class abstraction


【解决方案1】:

这是一种公认​​的设计,以后不会有任何问题/问题。

【讨论】:

    【解决方案2】:

    可以从非抽象方法调用抽象方法。您只需要注意不要在 start 调用的方法中调用 start()。 另外,我看到您的汽车类型被定义为字符串;为什么不使用枚举?

    【讨论】:

    • 枚举与其他方集成时会导致向后兼容性。这就是我选择不使用枚举并将其保留为字符串的原因。
    猜你喜欢
    • 2012-09-21
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多