【问题标题】:when overriding method why is it necessary to write it in superclass first, even when it isnt meaningful for superclass?当覆盖方法时,为什么必须先在超类中编写它,即使它对超类没有意义?
【发布时间】:2020-10-10 02:09:42
【问题描述】:

当重写一个方法时,为什么必须在超类中编写该方法,即使该方法在超类中没有用,所以在有意义的子类中重写该方法还不够。例如,如果有一个超类 A,有两个子类 B 和 C,我想覆盖一个方法 D,它只对子类 B 和 C 有意义,对超类 A 没有意义,那么为什么我们需要编写那个覆盖的方法A中的D,为什么我们不能只写在子类B和C中,而方法D对超类A没有意义。

【问题讨论】:

  • 您实际上想使用覆盖做什么?您不必在超类中编写方法。您根本不必使用覆盖。也许您正在寻找抽象方法,但不知道您要完成什么,很难说。
  • 我建议用两种方式编码,看看会发生什么。编写一个采用A 的方法。传入BC,它会覆盖A 上的方法。然后从A 中删除该方法。看看会发生什么。

标签: java oop inheritance methods overriding


【解决方案1】:

如果您不想在超类中实现,可以将方法和超类设为抽象。

abstract public class A {
    public abstract void aMethod();
}


public class B extends A{
    @Override
    public void aMethod() {
    }
}


public class C extends A {
    @Override
    public void aMethod() {
    }
}

【讨论】:

    【解决方案2】:

    当你创建一个打算从(通常是抽象的)扩展多次的超类时,它不需要使用其中的某些方法,只需要使用子类,这最容易用示例:

    public abstract class GameObject {
            public abstract void render(Graphics g);
    }
    

    这是现在的超类,它目前只有一个方法render。 这个超类可能有许多个子类。

    public class GameObject1 extends GameObject {
         @Override
         public void render(Graphics g) {
            g.drawsomething();
         }
    }
    

    子类 ^ ^ v v

    public class GameObject2 extends GameObject {
         @Override
         public void render(Graphics g) {
            g.drawsomethingelse();
         }
    }
    

    为每种单独的子类类型制作许多列表或执行以下操作会更容易吗:

    List<GameObject> objects = new ArrayList<GameObject>();
    
    public void renderEverything(Graphics g) {
          for(GameObject o : objects)
              o.render(g);
    }
    

    第二个例子比为每个子类类型创建大量列表更容易和更快

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多