Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这些实体的层次结构_Java_Oop - Fatal编程技术网

Java 这些实体的层次结构

Java 这些实体的层次结构,java,oop,Java,Oop,我需要为以下实体定义面向对象的类层次结构:计算机、处理器、赛扬处理器、Athlon处理器、HP、Dell、鼠标、键盘 我想到了以下几点: public interface Computer { public void mouse(); public void keyboard(); } public class Processor { public void Celeron(){ } public void Athlon(){ } } public class HP

我需要为以下实体定义面向对象的类层次结构:计算机、处理器、赛扬处理器、Athlon处理器、HP、Dell、鼠标、键盘

我想到了以下几点:

public interface Computer
{
    public void mouse();
    public void keyboard();
}
public class Processor
{
   public void Celeron(){ }
   public void Athlon(){ }
}
public class HP extends Processor,implements Computer
{
}
有人能指出这个设计有什么问题吗?还有,如果有人能提出更好的设计,那就太好了


谢谢。

您正在实现鼠标和键盘,以及celeron和athlon作为方法。他们应该分开上课。计算机也应该是一个类,而不是一个接口


我不明白你为什么希望“HP”扩展处理器并实现计算机。

我更愿意说,
计算机有一个
处理器
HP
是一台
计算机
<代码>戴尔
是一台
计算机

Celeron
是一款
处理器
Athlon
是一种
处理器

计算机
有一个
鼠标
和一个
键盘

有:关联。

是一种:继承

我认为下面这样做可能会有帮助:

public interface IInputDevice {}
public interface IProcessor {}

public abstract class Computer 
{
    IInputDevice[] inputDevices;
    IProcessor processor;
}

public class Mouse implements IInputDevice {}
public class KeyBoard implements IInputDevice {}

public class AthlonProcessor implements IProcessor {}
public class CeleronProcessor implements IProcessor {}

public abstract class HP extends Computer
{

}

public abstract class Dell extends Computer
{

}

不管编程语言如何,请停止并考虑如何建立一个信息模型来表示所讨论的问题。你有几种关系可供支配:

  • is-a

    某些事物或概念是对某些其他概念的细化或可互换,例如“赛扬处理器”是处理器。继承可以对这种关系建模,但并非所有继承都要对这种关系建模

  • 有一个

    某些事物包含或与其他事物相关,例如连接有键盘的计算机。结构中的成员变量或字段可以通过值包含(包括控制所包含对象的生命周期)或引用聚合(通常不控制关联对象的生命周期)对这种关系进行建模

  • 使用

    比has-a更一般的是,一件事需要引用其他的东西来完成它的工作。这可以表示为成员函数或方法的必需参数

对于您的问题,我们可以看到Celeron是一个处理器,计算机有一个处理器(一个或多个),HP是一家销售计算机的公司,或者,计算机有一个负责任的供应商(一个或多个),HP是一个供应商。惠普也可以出售鼠标,一台计算机可以连接零个或多个鼠标


我不愿意告诉您如何使用Java构建这样的模型。有很多解决方案,探索不止一个解决方案还可以深入了解为什么信息建模比Java的类和接口功能更具表现力。

听起来像是家庭作业。在我们为您做家庭作业之前,您能否先写一个简短的总结,说明您为什么会提出这样的设计?目前看来,您只是在编译时添加了一些内容:-P使用和键盘对于所有计算机都是通用的,因此每个品牌都可以自由定义其实现。一个品牌还可以覆盖它想要的处理器,并可以定义它自己的实现。那么HP或Dell将是计算机类的对象,还是将是另一个扩展计算机、赛扬、Athlon、鼠标、,键盘?我不知道所有的东西都是如何联系起来的。谢谢,在弗林希的回答上展开一点是非常有洞察力的,你们基本上只有两个关系:is-a和has-a。is-a应该给你一个像
Keyboard
本身的接口,而has-a应该给你一个像
haskiboard{public Keyboard getKeyboard();}
的接口。层次结构中较高的接口将扩展较低的接口。例如,
计算机键盘
。虽然这似乎是一个练习,但您不必对接口如此冗长,您应该创建尽可能多的接口以供练习。