面向对象程序设计?

Object oriented programming Design?

我是Java编程的新手,我正在修改关于OOP设计的问题,我发现了一个关于IS-A的问题HAS-A 关系。

我知道 IS-A 是一个 inheritance 关系,并且 Has-Acomposition ,但我想不出这个问题的目的。

我不需要答案,但我希望有人解释如何添加实例变量以显示 Has-A 关系,我知道我可以通过扩展短语来表达 IS-A 关系。

问题是:

Add extends phrases and instance variables to show IS-a and Has-A relationships between these classes .

  Class Address
   {

   }

  Class Business
   {

   }
  Class City
   {

   }
  Class Restaurant
   {

   }

  Class Theater
   {

   }

[Note: By Business, we mean anything that would appear in the Yellow Pages].

您可以在汽车 class 中创建一个轮子对象 class,因为汽车有多个轮子。

最好的方法是为 class "has".

的内容创建一个实例字段

例如,如果我要说一辆汽车有一个引擎,它可能看起来像这样。

Class Car{
  private Engine e;

  public Car(Engine anEngine){
     e = anEngine;
  }
}

也许这会对你有所帮助:

Class Address {
   City city; // HAS-A
}

Class Business {}

Class City {
   List<Business> business; // HAS-A
}

Class Restaurant extends Business{ // IS-A
    Address address; // HAS-A
}

Class Theater extends Business { // IS-A
    Address address;  // HAS-A
}

"has-a" 关系通常使用实例变量在 Java 类 中表示。

  • 根据关系的性质(一对一还是一对多等),您可以使用简单类型、数组类型、标准集合类型...或者更复杂的东西。

  • 根据需求,反向关系可能会有变量;即 "component-of".

  • 根据需求的其他方面(远远超出对象模型),您可以提供 getter 和 setter 或使用不同风格的 API。这些方法还可能负责使反向关系保持最新。


在您的上下文中,"has-a" Business 和 Address 之间的关系是一对一的,并且(通常)不需要反向映射。如果城市与企业的关系是真正的 "has-a" 关系,那么它就是一对多。

这些事情取决于您如何为世界建模,以及您这样做的目的。但是对于考试题,您可以做出合理的简化假设 (IMO),前提是您在答案中注明它们。

@Radek 的代码对我来说作为考试题的答案看起来不错,因为他没有显示 getter 和 setter。 (但正如我所说,那些方法超出了模型的范围......本身。)

我会关注@Radec 的回答:

class Business{}
class Restaurant extends Business{ // IS-A
    Address address; // HAS-A
}

Business res = new Restaurant();
if (res instanceof Restaurant){
   // Yes, res IS-A Restarant, but the reference is only a Business
}

IS-A 是多态性的一部分。