当前位置: 首页 > 知识库问答 >
问题:

面向对象设计--家具系统的可扩展设计

邰昀
2023-03-14

我在面试时遇到了这个问题,我不知道如何正确地回答它。问题是,我们有一个家具系统,我们可以管理不同的家具。每种家具都有自己的“代号”材料(如:木头、铁)和“代号”名称、“代号”类型(如:椅子、书桌、桌子)。

对于每一种家具,我们都可以调用isFireApproved()getWeight()。首先,我在顶部绘制名为家具材料的基类。在家具下面,我放了不同类型的家具,如桌子,椅子和做同样的事情材料类。如下图所示。

然后,我说如果我们要生产一件像woodchair这样的新家具,我们可以创建一个名为woodchair的新类,它继承了wood类和chair类。

wood_iron_wardrobe = CommonFurniture(type=[Wardrobe], materials=[Wood, Iron])

在构造函数中,我们利用这些参数创建一个新的家具项目。基于采访的脸色,我认为我没有回答对方向。对于这个设计有什么建议吗?或者对于学习OOD有什么推荐吗?

共有1个答案

江洲
2023-03-14

IMHO,就像你写的“我们可以创建一个新的类叫做woodchair,它继承了wood class和chair class”,我想,他不喜欢为家具和材料的每一种组合创建一个新的类的想法,因为可能的类数量很大。在这种情况下,人们可能更喜欢合成而不是继承。例如,家具有一个类型为Material的成员/属性。因此,您需要m具体类用于家具n类用于Material。对于继承,具体的产品需要m x n类。

而且material通常是静态的,您很少会更改material中的任何内容。而多重继承在许多语言中是不可能的。在Java中可能是这样的:

enum Material (
   WOOD (...),
   IRON (...)
)

class Furniture {
   Material material;
}

Furniture woodChair = new Chair(Material.WOOD);
Furniture ironChair = new Chair(Material.IRON);

这只是一个例子,一个人可以以更好的方式实现这一点。

 类似资料:
  • 我昨天接受了一次采访,问了一个问题: 赛车商店系统: 该系统存储有关可供玩家使用的汽车的信息。 两种换档策略:手动/自动 两种燃料:汽油/柴油 设计一个可以生产玩家要求的汽车的系统(如果玩家想要一辆手动换挡、燃烧柴油的汽车,你的系统应该提供一辆符合要求的汽车实例),系统应该具有良好的可扩展性和可运维性。 我的想法和解决方案: 我的想法是需求包含两个属性:齿轮和燃料。我计划制作一个抽象类包含属性和相

  • 本文向大家介绍java门禁系统面向对象程序设计,包括了java门禁系统面向对象程序设计的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了java门禁系统面向对象程序设计,供大家参考,具体内容如下 下面是对门禁系统的介绍: 需求 1、某公司安装了电子门,要设计门禁系统: 2、公司的雇员可以凭借密码、胸卡或指纹进入公司 3、计算机根据雇员的验证方式对其身份进行验证 4、管理员在监控室可以通过按

  • 7.4 面向对象设计* 理解了面 向 对象的基 本 概念之后 , 就可以应 用 这些概念 来 进行面向 对 象 设 计(object-oriented design,简称 OOD)。 传统的程序设计方法是结构化的自顶向下设计,其思想是将软件系统分解为若干个功能, 每个功能都是对数据的一个操作过程。功能又可以划分为若干个子功能,如此反复分解下去, 直至每个功能所对应的操作过程显而易见为止。在分解功能

  • 问题内容: 我正在设计一个简单的游戏,该游戏使用Java 2D和牛顿物理学。目前,我的主要“游戏循环”如下所示: 当指示实体更新自身时,它将根据当前施加在其上的力来调整其速度和位置。但是,我需要实体表现出其他行为。例如,如果“坏家伙”被玩家射击,则该实体应被销毁并从游戏世界中移除。 我的问题 :以面向对象的方式实现此目标的最佳方法是什么?到目前为止,我所见过的所有示例都将游戏循环整合到名为的类似的

  • “在面向对象编程中,抽象是对用户隐藏实现细节的过程,只有功能才会提供给用户。” 我一直在试图理解抽象,有人能告诉我们如何准确地隐藏实现细节吗?使用一个程序

  • ECMAScript对于对象的定义:无序属性的集合,其属性可以包含基本值、对象或者函数 JavaScript每个对象都是基于一个引用类型创建的。 引用类型可以是原生类型也可以是自己定义的类型。 原型规则和示例 5条原型规则 原型规则是学习原型链的基础 第1条 所有的引用类型(数组、对象、函数),都具有对象特质、即可自由扩展属性(除了“NULL”以外) var obj = {}; obj.a = 1