关于“面向对象程序设计”的一般理论问题,特别是有关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)
}
答案 0 :(得分:0)
定义超类中的某些内容以作为可重用性的手段。我不确定这是什么好习惯。
您确定获得“命中”的算法是否相同?
如果一艘船遭受爆炸性伤害,另一艘船遭受电击,而第三艘船受到EMP打击,该怎么办?伤害的损失会一样吗?
关于这个问题,是的,您可以在抽象类中使用私有方法,但是我建议您在选择之前先阅读继承之上的构成: https://en.wikipedia.org/wiki/Composition_over_inheritance
更新:
您应该朝这个方向思考:
这是一种生产者消费者的思维方式,涉及到的是茉莉花的组成而不是实际的继承。
答案 1 :(得分:0)
您的情况恰好是受受保护的修饰符的用法。 当然,您可以在抽象类中使用私有修饰符。 但是,只有当您200%确定内部实现的逻辑不会在后代中更改时-否则,支持它确实会很痛苦。 第二个问题是,如果您通过超类在子代中隐式调用这些私有方法,则将很难记住和理解实际发生的情况(尤其是如果继承级别提高了3-4级)
答案 2 :(得分:0)
您无法完全完成您想做的事情。私有方法不被子类继承。这是因为对私有方法的调用在编译时是静态绑定的,因此无法进行动态绑定(即多态)。
正如其他人指出的那样,与您所寻找的内容最接近的东西是受保护的,或者是私有包装的。
请注意,程序包私有方法仅由子类if the subclass is within the same package继承。
答案 3 :(得分:-1)
有三种或四种类型的方法标识符。私有,公共,受保护的和/或最终的。受保护的方法允许按其子类进行继承访问,但不允许任何不相关的类进行继承访问。