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

标签 java oop inheritance composition

所以我想我有一个非常基本的问题。假设有一个名为 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/

相关文章:

Python:是否可以从父类的实例构造子类的实例?

java - sbt 如何知道查看 app 文件夹中的 play 框架源代码?

java - 带有最终变量的 Android 内联监听器

java - 如何在纹理上绘画 [Libgdx]

javascript - OO Javascript 构造函数模式 : neo-classical vs prototypal

php - 范围解析运算符和类方法

c++ - 用 enum/int 覆盖函数

java - 为什么双端队列(ArrayDeque)容量是2的幂?

c# - 将基类列表转换为派生类列表 - 可能吗?

java - 如何在Java中的不同子对象之间放置不同的父对象中的静态变量