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

Moo有很多很棒的 class ,您大部分都不希望碰到,但您要做的是几门。现在,最好的办法是扩展您要修改的类,对吗? (我知道关于扩展与实现的讨论很多,但是这些类都不是接口,所以这是毫无疑问的。)

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

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专家甚至不需要五秒钟就可以得出答案。谢谢你的时间。

最佳答案

现在,假设我只想在扩展Milk的新类中使用getMilk。但是,Milk中的getMilk依赖于私有变量(例如currentMilk)和我将不包括的其他函数(例如convertToGallons。)如果我想让新函数正常工作,我是否必须包括其他变量和函数?

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

在这种情况下,覆盖getMilk非常棘手,因为它依赖于私有变量(您的子类无法访问)。我的建议是将您的观念从将 class 视为“白盒子”转变为“黑盒子”。我的意思是,您应该实现覆盖的getMilk版本,好像您实际上无法看到Milk的源代码一样。尽管这似乎是一种回旋解决方案(我的意思是,为什么我不能只在此处调整此行?!),但这将迫使您仅使用父类公开公开的内容来实现子类。它还极大地强调了抽象的重要性,这在开发大型项目时绝对至关重要。

08-07 03:31