面向对象程序设计?
Object oriented programming Design?
我是Java编程的新手,我正在修改关于OOP设计的问题,我发现了一个关于IS-A的问题 和 HAS-A 关系。
我知道 IS-A 是一个 inheritance 关系,并且 Has-A是 composition ,但我想不出这个问题的目的。
我不需要答案,但我希望有人解释如何添加实例变量以显示 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 是多态性的一部分。
我是Java编程的新手,我正在修改关于OOP设计的问题,我发现了一个关于IS-A的问题 和 HAS-A 关系。
我知道 IS-A 是一个 inheritance 关系,并且 Has-A是 composition ,但我想不出这个问题的目的。
我不需要答案,但我希望有人解释如何添加实例变量以显示 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 是多态性的一部分。