英文:
using interface and composition in java - reuse code with different variables
问题
我在尝试重用代码时遇到了问题。
我想使用主接口和两个类,但其中一些方法具有相同的实现,因此我决定使用组合。
我的意思是,声明“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
)
英文:
I have a problem during trying to do reuse code.
I want to use main interface with two classes, but some of the methods have same implements, so I decided to use compostion.
I mean, to declare instance of the "a" class and do on the method:
void do_some()
a.do_some()
the problem is that the function related to some data members.
for example:
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
what can I do? (I want to return LongTermStorage.current_capacity)
答案1
得分: 0
你可以这样做,但最好在构造函数中为组合创建一个实例。代码如下所示:
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
类的方法和属性。
英文:
You can do so, but it'd be better if you create an instance for composition at your constructor. So it would be like this:
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();
}
}
So, you will reuse Locker
methods and also its props.
答案2
得分: 0
如果LongTermStorage
是一种特殊类型的储物柜(Locker),你可以使用继承,让LongTermStorage
继承自 Locker
。这样,你只需要实现那些不同的方法:
public class LongTermStorage extends Locker {
// 无需实现 getAvailableCapacity(),因为从 Locker 继承的已经适用
// TODO: 实现其他 LongTermStorage 特定的功能
}
隐式地,LongTermStorage
也实现了 GeneralStorage
接口,因此你可以在任何需要使用 GeneralStorage
的地方使用它。
英文:
If LongTermStorage is a special kind of Locker you can use inheritance and let LongTermStorage extend from Locker. This way you only have to implement the methods which are different:
public class LongTermStorage extends Locker {
// No need to implement getAvailableCapacity() as the one from Locker is fine
// TODO: implement other stuff specific for LongTermStorage
}
Implicitly LongTermStorage
also implements the GeneralStorage
interface so you can use it wherever you want to use GeneralStorage
答案3
得分: 0
我不太了解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
耦合在一起。
英文:
I don't know Java well, but do this instead of what was recommended above:
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())
Don't couple LongTermStorage
to Locker
by calling new
in the constructer.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论