关于继承Java类的性质的问题

所以我认为我有一个非常基本的问题.假设您的项目com.bee.buzz中包含一个名为com.cow.moo的开源Java程序.

moo有很多很棒的课程,其中大部分是你不想触摸的,但是有一些你做的.现在,在这一点上,最好的办法是扩展你想要修改的类,对吧? (我知道有很多关于扩展与实现的说法,但这些类都不是接口,所以这是不可能的.)

我的问题是,说这是moo中的类:

package com.cow.moo;
public class Milk {
    private float currentMilk;
    public int getMilk() { /* Stuff */ }
    public float convertToGallons (float liquid) { /* More Stuff */ }
}

现在,假设我想在扩展Milk的新类中使用getMilk.但是,Milk中的getMilk依赖于私有变量(如currentMilk)和其他我不会包含的函数(如convertToGallons.)如果我希望我的新函数正常工作,我是否必须包含其他变量和函数?我不想大量修改函数,只需添加一点就可以了.最好的方法是什么?

一般来说,建立一个更大的项目的提示也是有用的.我认为这里的一些Java专家甚至不会花五秒钟来得出答案.谢谢你的时间.

解决方法:

Now, say I want to just use getMilk in my new class that extends Milk. However, getMilk in Milk relies on private variables (like currentMilk) and other functions I won’t be including (like convertToGallons.) Will I have to include those other variables and functions if I want my new function to work correctly?

您不必包含公共函数和变量.继承的核心概念是,作为子类,您可以免费获得子类中包含的所有父类的公共(和受保护)成员.所以你的子类(比如说HoneyMilk)可以从一开始就调用convertToGallons.

在这种情况下重写getMilk会非常棘手,因为它依赖于私有变量(您的子类无法访问).我的建议是将你的思维方式从把班级视为“白盒子”转变为“黑匣子”.我的意思是你应该实现你的被覆盖版本的getMilk,就好像你实际上看不到Milk的源代码一样.虽然它可能看起来像一个迂回的解决方案(我的意思是,为什么我不能在这里调整这一行?!),这将迫使您仅使用父类公开公开的内容来实现您的子类.它还强调抽象的重要性,这对于开发大型项目绝对至关重要.

上一篇:Java – 接口实现中的方法名称冲突


下一篇:有没有办法在PHP中实现多重继承?