Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象类和私有方法_Java_Oop - Fatal编程技术网

Java 抽象类和私有方法

Java 抽象类和私有方法,java,oop,Java,Oop,这是一个关于“面向对象编程”的理论问题,在java中尤其如此。 假设我有一个抽象的“SpaceShip”类,我想扩展它并创建另一个类,即“SpaceShipTypeX”和“SpaceShipTypeZ” 将来可能会有更多,但无论如何,这两种方法都应该有一些相同的代码/方法,比如说,“fire()”、“speedUp()”等等。。。 我可以在抽象类中实现这些,这样我就可以重用代码(太棒了!) 和/或为每艘宇宙飞船更改它。 现在,当我想实现一个名为“getHit()”的方法时,问题就出现了——当飞船

这是一个关于“面向对象编程”的理论问题,在java中尤其如此。 假设我有一个抽象的“SpaceShip”类,我想扩展它并创建另一个类,即“SpaceShipTypeX”和“SpaceShipTypeZ” 将来可能会有更多,但无论如何,这两种方法都应该有一些相同的代码/方法,比如说,“fire()”、“speedUp()”等等。。。
我可以在抽象类中实现这些,这样我就可以重用代码(太棒了!) 和/或为每艘宇宙飞船更改它。 现在,当我想实现一个名为“getHit()”的方法时,问题就出现了——当飞船被击中时,它会降低飞船的健康状况。 但是我希望它以不同的方式在每个类中实现,我也希望它在它们中是私有的,但是它们都有相同的方法签名,因此它必须在抽象类中,因为多态性的原因,尽管我希望它是私有的,因为我想对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)

}
我想对公共API隐藏的方法:

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

有三种或四种类型的方法标识符。Private、Public、Protected和/或Final。Protected方法允许通过其子类而不是任何不相关的类进行继承访问。

将超类中的某些内容定义为可重用性。我不确定这在多大程度上是一种好的做法

你确定被击中的算法是一样的吗

如果一艘船受到爆炸性伤害,另一艘船受到电力伤害,第三艘船被电磁脉冲击中,那么损失会是一样的吗

关于这个问题,是的,您可以在抽象类中使用私有方法,但我建议您在做出选择之前先阅读Composition over heritation

更新:

你可以从这个方向思考:

  • Ship有1个或多个漏洞
  • 脆弱性有火灾、爆炸、电磁脉冲……你可以将其视为伤害的函数
  • 船会造成损害
  • 损坏可以有一种或多种类型

这是一种生产者-消费者的思维方式,涉及到mroe组成而非实际继承。

您的案例正是关于受保护修改器的使用。 当然,您可以在抽象类中使用私有修饰符。 但只有当您200%确定内部实现的逻辑不会在子代中更改时,否则支持它将是一件非常痛苦的事情。
第二个问题是,如果通过超类在子代中隐式调用这些私有方法,那么就很难记住和理解真正发生了什么(特别是如果继承级别超过3-4级)

您无法完全完成您要做的事情。私有方法不会被子类继承。这是因为对私有方法的调用在编译时是静态绑定的,所以动态绑定(即多态性)无法发生

正如其他人所指出的,与您要查找的内容最接近的东西要么是受保护的,要么是包私有的


请注意,包私有方法仅由子类继承。

请展示演示您尝试执行的操作的代码。很难用文字描述。“我可以在抽象类中实现这些方法,以便可以重用代码(很棒!)”继承不是代码重用的唯一工具:合成是一种(通常更好的)方法备选方案。我不能在抽象类中使用私有函数:是的,你可以。一个方法也可以被保护。那么,
protected
呢?这个答案在这里我想避免使用protected,因为它将在java文档中显示,并且有点“公共api”“因为有些用户可以在同一个软件包中工作并意外地使用它,所以在这种情况下请考虑使用接口。类似于:公共接口易受攻击{void getHit();}公共类SpaceShipX扩展SpaceShip弹劾易受攻击{..}抱歉,接口不是选项,SpaceShipX是一艘宇宙飞船…不,命中的算法并不总是相同的,这就是为什么我希望它在子类中实现,但我想对用户隐藏它,我希望每个类都保证有这个函数。
private void getHit() {
// TODO: reduce some health (IMPLEMENT)
}