【问题标题】:Java - extending a class and reusing the methods?Java - 扩展一个类并重用方法?
【发布时间】:2011-09-21 16:25:57
【问题描述】:
public class BaseClass {
   public void start() {
      // do something
   }
}

public class ClassA extends BaseClass {

}

ClassA c = new ClassA();
c.start();

在下面的代码中,我想使用在超类中定义的 start() 方法,我在很多其他开发人员的代码中看到他们覆盖超类中的方法,然后调用超类.有什么原因吗?

public class ClassA extends BaseClass {
   @Override
   public void start() {
      super.start();
   }
}

【问题讨论】:

  • @Jeanne Boyarsky,就在钱上!这是每个开发人员的偏好问题,通常您的文档应该足够好,您不需要这样做,但更清晰总是比更少更好。

标签: java class extend inheritance


【解决方案1】:

继承概念背后的主要原因是子类之间通用的功能或操作的泛化。仅当我们需要为特定子类自定义操作时才有意义。

  • 但是我们确实需要进行覆盖的一个地方是,假设你已经重载了你的超类默认构造函数,那么在子类中你需要提到重载的超类构造函数的调用作为你的子类的第一行构造函数(即超类对象必须在创建子类之前创建)。 例如

类基类{

基类(arg1){

}

}

A 类扩展 BaseClass{

一个{ 超级(arg1); }

}

在其他地方它只会增加代码的冗余,这根本没有必要

【讨论】:

    【解决方案2】:

    覆盖一个方法,做一些特别的事情,然后调用super.method() 被称为装饰一个方法 - 你是在添加到行为中。在此处阅读更多信息:Decorator Pattern

    在不调用 super 方法的情况下覆盖它只是覆盖一个方法 - 改变行为。

    【讨论】:

      【解决方案3】:

      当我想在那里设置断点时,我有时会这样做(暂时,在开发期间)。

      【讨论】:

      • @javaguy:然后它也会在超类实例中中断。
      【解决方案4】:
      public class ClassA extends BaseClass {
        @Override
        public void start() {
           super.start();
        }
      }
      

      与完全不覆盖完全一样

      public class ClassA extends BaseClass {}

      所以除非你有一些额外的功能要添加(在这种情况下你调用超类的方法然后添加你的额外逻辑)或做一些不同的事情(你不调用超类的方法而只是定义一些不同的逻辑),最好不要覆盖超类的方法(并调用超类的方法),因为它没有意义。

      【讨论】:

        【解决方案5】:

        清晰度?一些开发人员认为在子类中显示方法更清晰。我不同意。这是多余的信息。

        至少从 Java 5 开始,您可以添加一个 @Override 以便编译器会告诉您签名是否更改/消失。

        构造函数除外。对于构造函数,您确实必须使用相同的签名创建自己的并向上委托。在这种情况下,省略并不等同。

        【讨论】:

        • +1 这是多余且令人困惑的。如果您看到该方法被覆盖(IDE 会显示给您,即使您看不到源代码),您会认为它除了继承的默认值之外还做了其他事情。此外,如果您覆盖该方法,则应该有它的 Javadoc。
        • @Thilo:我个人并没有发现它更清晰,也没有在我的团队中实践它。争论是Java 新手没有查看超类的习惯。 (不使用三元运算符的论点相同。)我不喜欢过度适应非 Java 开发人员的东西。人们应该学习自己正在研究的语言的惯例和习语。
        猜你喜欢
        • 1970-01-01
        • 2017-09-25
        • 1970-01-01
        • 2013-06-14
        • 1970-01-01
        • 2011-05-12
        • 2013-02-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多