我有一个简单的例子:
public class Order
{
private ArrayList<Product> orders = new ArrayList<Product>();
public void add(Product p)
{
orders.add(p);
}
}
它是聚合还是组合?我猜是组合,因为订单删除后订单会被删除,对吧?不幸的是,这是一项任务,答案是不同的;/你知道为什么吗?
第二个问题:
public class Client extends Person
{
String adress = "";
Orders orders = new Orders();
public Client(String n, String sn)
{
name = n;
surName = sn;
}
public String getAddress()
{
return adress;
}
public Orders getOrders()
{
return this.orders;
}
}
是客户和订单之间的关联吗?我的老师告诉我这是关联,但我想知道为什么它不是聚合/组合-他告诉我只有当一个类包含不同类的几个实例时,聚合或组合才会发生-对吗?我猜不是,因为例如car包含一个轮子和它的聚合?
这是一种什么类型的关系?为什么?
发布于 2010-12-01 21:30:31
您的第一个示例是聚合。在删除Order实例时,变量orders
可能会被删除,但每个Product仍然有意义,并且可以存在于Order类之外。
在您的第二个示例中,您是正确的。因为Client包含对Orders的(has-a)引用,所以这是组合(因为没有Client
就不存在orders
)。
更新以解决您的评论:
聚合和组合都是不同类型的关联,但它们是特定类型的关联。为了让两个类只有一个没有聚合或组合的关联,它们需要一个比所给出的示例更弱的链接。下面是一个(人为的)例子:
class A {
String phrase = "These pretzels are making me thirsty.";
public String process(B b) {
// use a B object to do something
String tmp = b.doSomething(phrase);
// do more processing...
return tmp;
}
}
class B {
public String doSomething(String s) {
// do something with the input string and return
...
}
}
这里没有组合或聚合(A没有自己对B对象的引用),但由于B的实例由A中的方法使用,因此存在关联。
发布于 2012-06-03 12:13:17
我认为,第一个例子不是聚合,而是组合。因为这里的订单构成了产品。如果订单被删除,那么产品将被自动删除。
class Product;
class Factory {
Product *product;
product = new Product();
product createProduct() {
return new(product);
}
};
class Product {
ArrayList<Order> *orders = new ArrayList<Order>();
void createOrder() {
orders.add(OrderInfomation);
}
}
class Order {
string orderID;
string orderName;
Customer customer;
};
class Customer {
string cusID;
string cusName;
string cusAddress;
};
在这里,Product可以具有相同的订单类型。如果产品被删除,那么订单也将被删除。所以这是一首曲子。(高度强耦合或死亡关系)
在您的案例中,订单与产品相关联。一个订单可以包含任何产品订单。所以这是一种关联。如果订单被删除,则产品将存在。(轻度耦合)类似地,客户和订单具有关联关系。
Factory和Product是聚合的。即使删除了产品,工厂也会存在。
发布于 2010-12-01 21:27:46
在Java中,确实没有组合,一切都是聚合。组合可以存在于像C++这样的语言中,在这种语言中,对象可以在堆栈上声明,并且可以与父对象一起存在和消亡。在Java中,一切都依赖于堆。
对于您的第二个问题,Order与Product具有聚合关系。关联关系可以是当我们将order作为参数传递给product中的方法时。Product使用传递的引用执行此工作,但不会将该引用缓存到某个子引用中。
https://stackoverflow.com/questions/4324704
复制相似问题