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

And*_*bon 3 java oop inheritance composition

所以我认为我有一个非常基本的问题.假设您的项目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 */ }
}
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*s_D 6

一般建议是赞成合成而不是继承.

比如说,你有一个接口和一个现有的实现,大多数符合你的需要,比如

public interface MilkProvider { public float getMilk(); }
public class Milk implements MilkProvider { // same as you example }
Run Code Online (Sandbox Code Playgroud)

并需要另一个自定义实现,你可以这样编码:

public class MyMilk implements MilkProvider {
  private MilkProvider milk; 

  public MyMilk(int someValue) {
    milk = new Milk(someValue);  // unfortunatly we can't get rid of a depencency
                                 // to the concrete class because we need to create
                                 // something. An existing factory could help, but
                                 // but usually there's none implemented.
  }

  public float getMilk() {
    float result = milk.getMilk();
    // do somethink with the result
    return float;
  }
}
Run Code Online (Sandbox Code Playgroud)