这感觉就像这样一个基本问题,但这对我来说是全新的:
我有一个Person和Room类,它们都有Item对象列表。
public class Person{
private ArrayList<Item> items;
public Person() {
items = new ArrayList<>();
}
public void addItem(){
...
}
public void removeItem(){
...
}
}
public class Room {
private ArrayList<Item> items;
public Room () {
items = new ArrayList<>();
}
public void addItem(){
...
}
public void removeItem(){
...
}
}
项目方法,例如addItem()在Room类和Person类中都是重复的,这不是很好。我想要制作一个单独的库存类,其中包含项目和项目方法的列表,然后每个房间和人员都有一个库存。
但是如果我使用私人库存字段,那么我将无法从人员或房间调用Item方法。
这里停止复制的最佳方法是什么?提前谢谢!
答案 0 :(得分:7)
你是对的。制作单独的库存类将是一个很好的OOP设计。
我很高兴您没有说要为Room
和Person
创建一个父类,因为虽然这样可以避免重复,但房间和人员并不相关,所以他们不应该真的在面向对象的意义上也是相关的。
您可以使用委派将添加/删除项目委派给Inventory
字段。
public class Room {
private Inventory inventory = new Inventory();
public void addItem(Item item) {
inventory.addItem(item);
}
public void removeItem(Item item) {
inventory.removeItem(item);
}
}
修改强>
有些人建议公开广告资源,然后在person.getInventory().addItem(item)
上公开添加/删除方法。我认为这会违反Law of Demeter
答案 1 :(得分:0)
我认为库存类是最好的方式。您可以通过为Person
和Room
内的广告资源创建一个getter来使用项目方法。
答案 2 :(得分:0)
根据您的业务领域,您可以拥有一个抽象的存储容器类,它们都可以继承。抽象存储容器上有方法,所以你仍然可以直接调用它们。
您还可以为两个类提供IStorageContainer的空接口,然后使用静态方法创建一个新的静态类,该方法接收IStorageContainer的第一个参数。
然后你可以调用AddItem(thisPerson,item)和RemoveItem(thisPerson,item),但是能够使用相同的代码和实现为这两个类重用这两个方法。