Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中使用接口和组合-使用不同变量重用代码_Java_Oop_Design Patterns_Interface_Composition - Fatal编程技术网

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

在java中使用接口和组合-使用不同变量重用代码,java,oop,design-patterns,interface,composition,Java,Oop,Design Patterns,Interface,Composition,我在尝试重用代码时遇到了一个问题。 我想对两个类使用主接口,但有些方法具有相同的实现,所以我决定使用组合。 我的意思是,要声明“a”类的实例并对该方法执行以下操作: void do_some() a.do_some() 问题是该函数与某些数据成员相关。 例如: public class Locker implements GeneralStorage { private final int current_capacity; public int getAvailableCap

我在尝试重用代码时遇到了一个问题。 我想对两个类使用主接口,但有些方法具有相同的实现,所以我决定使用组合。 我的意思是,要声明“a”类的实例并对该方法执行以下操作:

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

我能做什么?(我想返回LongTermStorage.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())

不要通过在构造函数中调用
new
LongTermStorage
Locker
耦合。

LongTermStorage不是一种Locker,它有另一个构造函数。所以我认为第一个选择是最好的。