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专家甚至不会花五秒钟来得出答案.谢谢你的时间.
一般建议是赞成合成而不是继承.
比如说,你有一个接口和一个现有的实现,大多数符合你的需要,比如
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)