在java中使用接口和组合-使用不同变量重用代码
我在尝试重用代码时遇到了一个问题。 我想对两个类使用主接口,但有些方法具有相同的实现,所以我决定使用组合。 我的意思是,要声明“a”类的实例并对该方法执行以下操作:在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
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,它有另一个构造函数。所以我认为第一个选择是最好的。