首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可扩展的面向对象的家具设计系统

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

Stack Overflow用户
提问于 2020-01-23 06:34:26
回答 1查看 984关注 0票数 0

我在面试时遇到了这个问题,我不知道如何正确地回答它。问题是我们有一个家具系统,我们可以管理不同的家具。每件家具都有自己的material (例如:木头,铁)和nametype (例如:椅子,书桌,桌子)。

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

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

然后,面试官问道,如果我们有成千上万种不同的家具怎么办?在这个架构中可能会发生什么以及如何解决它?我基本上停留在这里,回答说我们可以创建一个通用的类,将家具类型和材料传递到实例中。

例如:

代码语言:javascript
运行
复制
wood_iron_wardrobe = CommonFurniture(type=[Wardrobe], materials=[Wood, Iron])

在构造函数中,我们使用这些参数来创建一件新的家具。基于面试的表情,我认为我没有回答正确的方向。对这个设计有什么建议吗?或者,对于学习OOD有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-24 00:08:47

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

此外,Material通常是静态的,您很少在Material中更改任何内容。在许多语言中,多重继承是不可能的。在Java中,它可能如下所示:

代码语言:javascript
运行
复制
enum Material (
   WOOD (...),
   IRON (...)
)

class Furniture {
   Material material;
}

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

这只是一个例子,你可以用更好的方式来实现它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59869220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档