在 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())
不要通过在构造函数中调用 new
将 LongTermStorage
耦合到 Locker
。
我在尝试重用代码时遇到问题。 我想使用两个 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())
不要通过在构造函数中调用 new
将 LongTermStorage
耦合到 Locker
。