在 java 中使用接口和组合 - 重用具有不同变量的代码

using interface and composition in java - reuse code with different variables

我在尝试重用代码时遇到问题。 我想使用两个 classes 的主界面,但有些方法具有相同的实现,所以我决定使用组合。 我的意思是,声明“a”的实例 class 并在方法上执行:

void do_some()
a.do_some()

问题是函数与某些数据成员有关。 例如:

 public class Locker implements GeneralStorage {
    private final int current_capacity;

  public int getAvailableCapacity(){
        return current_capacity;
      }
}

public class LongTermStorage implements GeneralStorage {
    private final int current_capacity;
    private Locker locker=New Locker();
       public int getAvailableCapacity(){
           return locker.getAvailableCapacity

我能做什么? (我要returnLongTermStorage.current_capacity)

你可以这样做,但如果你在你的构造函数中创建一个组合实例会更好。所以它会是这样的:

public class Locker implements GeneralStorage {
  private final int current_capacity;

  public int getAvailableCapacity(){
    return current_capacity;
  }
}

public class LongTermStorage implements GeneralStorage {
  private Locker locker;

  public LongTermStorage() {
    locker = new Locker();
  }

  public int getAvailableCapacity(){
    return locker.getAvailableCapacity();
  }
}

因此,您将重用 Locker 方法及其道具。

如果LongTermStorage 是一种特殊的Locker,您可以使用继承并让LongTermStorage 从Locker 扩展。这样你只需要实现不同的方法:

public class LongTermStorage  extends Locker {
    // No need to implement getAvailableCapacity() as the one from Locker is fine

    // TODO: implement other stuff specific for LongTermStorage
}

隐含地 LongTermStorage 也实现了 GeneralStorage 接口,所以你可以在任何你想使用的地方使用它 GeneralStorage

我不太了解 Java,但请按照上面的建议执行此操作:

interface GeneralStorage {
    void addProduct(Product product);
    void removeProduct(Product product);
    void close();
}

public class Locker implements GeneralStorage {
  private Product[] products;

  public void addProduct(Product product) {...};
  public void removeProduct(Product product) {...};
  public void close() {...};
}

public class LongTermStorage implements GeneralStorage {
  private GeneralStorage storage;

  public LongTermStorage(GeneralStorage storage) {
    this.storage = storage;
  }
  
  public void addProduct(Product product) {
    // some kind of logic
    storage.addProduct(product)
  };
  public void removeProduct(Product product) {...};
  public void close() {...};
}

GeneralStorage storage = new LongTermStorage(new Locker())

不要通过在构造函数中调用 newLongTermStorage 耦合到 Locker