【发布时间】:2014-11-01 03:25:13
【问题描述】:
我正在为邻居做一个小应用程序,目前对设计很困惑。开始看起来很简单,但现在我被卡住了。我理解继承,因此,
- 所有礼物都必须包装好。
- Gift 是一个抽象类。
- 包装样式是一个抽象类。
- 生日礼物继承自 Gift。
- 折纸样式继承自环绕样式。
场景:用户向商店赠送礼物,并附上其身份(例如为家人生日,为同事生日)。所以有一份生日礼物是送给同事的,这与送给家人的礼物不同。用户指定他们喜欢使用的包装样式。 (例如折纸、西式)在这种情况下,假设给同事的生日礼物必须使用折纸下的生日样式进行包装。
但是如何将礼物与包装联系起来呢?起初,包装对我来说就像一个界面。所以礼物实现了它。但是包装每个主要包装样式都有子包装样式的事实使得它变得复杂。同事的礼物对象生日怎么知道要实现哪个接口呢?好像生日、婚礼也应该是抽象类,因为只有第 3 代礼品类是具体类。
我怎样才能让这个设计既有意义又易于编码,并在以后有修改/改进的空间?
【问题讨论】:
-
我认为在设计复杂的类层次结构之前,您需要更清楚地指定域是什么以及您的程序试图解决什么问题。你想建模什么概念?从有限的描述来看,听起来您试图将太多概念放入类层次结构中。例如,朋友的结婚礼物是一种礼物吗?或者,礼物是否有场合(例如婚礼、生日等)、关系(例如家人、朋友、同事),以及包装样式。请注意这些名词如何成为它们自己的类型。首先列出所有概念及其关系。
-
@mike z Gift 有不同的类型礼物。这些儿童礼物中的每一个都有子类型。生日礼物永远不能和毕业礼物一样。但是由于方形和圆形继承自形状类,我的礼物继承自礼物类。我有一个困惑,我应该写 12 种不同类型的具体类(生日家庭、生日同事、婚礼朋友、婚礼家庭、毕业朋友、毕业家庭等)继承自礼物抽象类,因为每个人都没有自己独特的属性和方法?这根本没有任何意义:(
-
如果生日礼物永远不能和毕业礼物一样,那为什么还要继承同一个基类呢?您的模型中子类型的激增是为什么我建议不要为每个场合/关系配对制作礼物子类型,而是让它们成为礼物对象的属性。该想法的适用性取决于该程序的设计目的。正如一些人已经提出的,礼物不是一种包装方式,而是一种包装方式。
标签: c# oop inheritance interface abstract-class