【问题标题】:Is there a difference between calling a supermethod and not implementing?调用超方法和不实现之间有区别吗?
【发布时间】:2016-10-04 12:33:18
【问题描述】:

在以下示例中,调用 FirstChildclass first; first.someMethod(); 将执行与 SecondChildclass second; second.someMethod(); 相同的操作。还是我错了?

class Superclass {
   public void someMethod() {
      //do something
   }
}

class FirstChildclass extends Superclass {

   @Override
   public void someMethod() {
      super.someMethod();
   }

   public void someOtherMethod() {
      //do something else
   }
}

class SecondChildclass extends Superclass {

   public void someOtherMethod() {
      //do something else
   }
}

有没有理由像FirstChildclass 那样实现它?因为我见过很多类似FistChildclass 的实现,我想知道为什么有人会这样做。

【问题讨论】:

  • 尝试编写并运行它
  • “子”类似乎没有实现或扩展任何东西
  • 只有构造函数才有意义。
  • 顺便说一句,你的子类实际上并没有扩展SuperClass

标签: java inheritance


【解决方案1】:

如果您询问两者之间的区别:

@Override
public returnType someName() {
    return super.someName();
}

而不是覆盖它。这样做没有区别,也没有任何意义。

您应该调用super.someName(),以防您想扩展原始方法。

当心!如果您有一个要在子类中使用的构造函数,但您不需要任何其他行为,您将调用super(arguments)

【讨论】:

  • void 方法不能返回任何东西
  • TY,xenteros。我也有同样的看法,但想确定一下。
【解决方案2】:

这是关于您的设计的。覆盖意味着您想要更改从父级继承的现有实现。 如果您没有做任何不同的事情,那么您就不想这样做

@Override
public void someMethod() {
      super.someMethod();
}

那没用。

@Override
public void someMethod() {
   // do some other logic
   super.someMethod();
   // do some other logic
}

这完全没问题 :) 因为您正在执行父级实现之外的一些任务。

【讨论】:

  • 为什么我得到-1?
  • 这是正确的。但是,请注意,这有时可能是设计不佳的标志(在基类或派生类或两者中)。
  • 是的,我同意,这可能会失去覆盖的原始概念
  • unless parent class is abstract and the method is abstract.---最好把这部分删掉。这可能是投反对票的原因。
猜你喜欢
  • 1970-01-01
  • 2010-09-07
  • 2021-06-17
  • 1970-01-01
  • 2017-09-19
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
相关资源
最近更新 更多