所以我想我有一个非常基本的问题。假设有一个名为 com.cow.moo 的开源 Java 程序,您将其包含在项目 com.bee.buzz 中。
moo 有很多很棒的类,其中大部分你不想碰,但有几个你想碰。此时,最好的办法是扩展您要修改的类,对吗? (我知道有很多关于扩展与实现的讨论,但这些类都不是接口(interface),所以这是不可能的。)
我的问题是,假设这是 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 依赖于私有(private)变量(如 currentMilk)和其他我不会包含的函数(如 convertToGallons。)如果我希望我的新函数正常工作,我是否必须包含那些其他变量和函数?我不想大量修改功能,只需添加一点即可。执行此操作的最佳方法是什么?
构建大型项目的一般技巧也很有用。我估计这里的一些 Java 专家甚至不需要五秒钟就可以得出答案。感谢您的宝贵时间。
最佳答案
一般的建议是倾向于组合而不是继承。
比如说,你有一个接口(interface)和一个最能满足你需要的现有实现,比如
public interface MilkProvider { public float getMilk(); }
public class Milk implements MilkProvider { // same as you example }
并且需要另一个自定义实现,您可以这样编码:
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;
}
}
关于java - 关于继承的Java类的性质的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3465526/