抽象类和私有方法

时间:2019-06-25 20:13:18

标签: java oop

关于“面向对象程序设计”的一般理论问题,特别是有关Java的问题。 假设我有一个抽象的“ SpaceShip”类,并想对其进行扩展并创建另一个类,即“ SpaceShipTypeX”和“ SpaceShipTypeZ” 将来可能会更多,但是无论如何,两者都应该具有相同的代码/方法,例如“ fire()”,“ speedUp()”等。 我可以在抽象类中实现这些,因此我可以重用代码(太好了!) 和/或为每个SpaceShip进行更改。 现在,当我想实现一个名为“ getHit()”的方法时,就会出现问题。当该方法被击中时,它会减少SpaceShip的运行状况。 但是我希望在每个类中以不同的方式实现它,也希望将它们私有化,但是它们都具有相同的方法签名,因此出于多态性原因,必须在抽象类中实现,尽管我希望它是私有的,因为我想将它隐藏在api中,因为它的内部功能并不希望其他用户为它烦恼。 因此,因为我不能在抽象类中使用私有函数,所以我陷入了困境。 我该怎么办? (我也想避免使用protected,因为它将在java文档中显示,并且有点像“公共api”,因为某些用户可以在同一个程序包中工作并意外使用它”)

一些有趣的代码:

public abstract class SpaceShip {
    public health = 100;

    public abstract void fire();
    public abstract void speedUp();
    private abstract void getHit(); // <------ It's not allowed (and doesn't make sense but I need it)

}

spaceshipY:

public class SpaceShipX extends SpaceShip{
    public void fire(){
    // TODO: implement
    }

    public void speedUp() {
    // TODO: implement
    }
}

我想从公共API中隐藏的方法:

private void getHit() {
// TODO: reduce some health (IMPLEMENT)
}

4 个答案:

答案 0 :(得分:0)

定义超类中的某些内容以作为可重用性的手段。我不确定这是什么好习惯。

您确定获得“命中”的算法是否相同?

如果一艘船遭受爆炸性伤害,另一艘船遭受电击,而第三艘船受到EMP打击,该怎么办?伤害的损失会一样吗?

关于这个问题,是的,您可以在抽象类中使用私有方法,但是我建议您在选择之前先阅读继承之上的构成https://en.wikipedia.org/wiki/Composition_over_inheritance

更新:

您应该朝这个方向思考:

  • 船有1个或多个漏洞
  • 漏洞的类型为:火灾,爆炸,EMP .....您可以将其视为损害的函数。
  • 船会造成伤害。
  • 损坏可以有一种或多种。

这是一种生产者消费者的思维方式,涉及到的是茉莉花的组成而不是实际的继承。

答案 1 :(得分:0)

您的情况恰好是受受保护的修饰符的用法。 当然,您可以在抽象类中使用私有修饰符。 但是,只有当您200%确定内部实现的逻辑不会在后代中更改时-否则,支持它确实会很痛苦。 第二个问题是,如果您通过超类在子代中隐式调用这些私有方法,则将很难记住和理解实际发生的情况(尤其是如果继承级别提高了3-4级)

答案 2 :(得分:0)

您无法完全完成您想做的事情。私有方法不被子类继承。这是因为对私有方法的调用在编译时是静态绑定的,因此无法进行动态绑定(即多态)。

正如其他人指出的那样,与您所寻找的内容最接近的东西是受保护的,或者是私有包装的。

请注意,程序包私有方法仅由子类if the subclass is within the same package继承。

答案 3 :(得分:-1)

有三种或四种类型的方法标识符。私有,公共,受保护的和/或最终的。受保护的方法允许按其子类进行继承访问,但不允许任何不相关的类进行继承访问。