Java继承强迫我在调用super()时执行我不想要的操作

时间:2010-11-28 23:58:47

标签: java inheritance

我正在阅读Oracle网站上的官方Java教程,我不喜欢在尝试继承时看到的内容。

我创建了一个Bicycle类和一个可以扩展Bicycle的MountainBike类。 MountainBike被迫从自己的构造函数中调用Bicycle的构造函数上的super(),但这就是:

A Bicycle has been created.
A Bicycle has been created.
A MountainBike has been created.

当类看起来像这样(片段)时:

public Bicycle(int speed) {
 this.speed = speed;
 System.out.println("A Bicycle has been created.");
}

public MountainBike(int seatHeight, int speed) {
 super(speed);
 this.setSeatHeight(seatHeight);
 System.out.println("A MountainBike has been created.");
}

这不是理想的行为。

  1. 这是继承的共同缺点吗?
  2. 在这种情况下你做什么?

2 个答案:

答案 0 :(得分:4)

有什么缺点? MountainBike类调用Bicycle构造函数,因此您将看到“已创建自行车”的输出。在你看到“A MountainBike已被创建”之前。输出。

如果你说你不想看到“已经创建了一辆自行车”。在创建MountainBike时输出,您可能希望将BicycleMountainBike的创建包含在另一个知道要显示哪个输出的类中。但基本上你在输出中看到的是你期望看到的MountainBike 也是Bicycle

public class BikeWarehouse {

    public Bicycle buildBicycle(int speed) {
        Bicycle bicycle = new Bicycle(speed);
        System.out.println("A Bicycle has been created.");
        return bicycle;
    }

    public MountainBike buildMountainBike(int seatHeight, int speed) {
        MountainBike mountainBike = new MountainBike(seatHeight, speed);
        System.out.println("A MountainBike has been created.");
        return mountainBike;
    }
}

或者您可以在toString()Bicycle类中添加MountainBike方法,然后在创建时,您可以:

System.out.println("A " + bike + " has been created");

显然toString()的{​​{1}}会返回Bicycle"Bicycle"的{​​{1}}会返回toString()

我也不经常使用方面,但我相信可以做一些与上面类似的事情,而不会乱丢你的代码库(如果你发现上面的“乱扔垃圾”),但你可能能够登录创建使用AspectJ之类的对象。我通常不是太多基于方面的解决方案的忠实粉丝,但可能需要考虑。

答案 1 :(得分:1)

数目:

  1. 这不是缺点。这是一个功能。说真的: - )

  2. 将'System.out.println(“已创建XXX”。)'移至受保护的方法,并使用它代替System.out.println的静态调用。