需要一般继承行为/最佳实践

时间:2010-11-17 21:01:22

标签: inheritance design-patterns

我有一个通用的设计模式问题,融合了对象的继承。不,我不是说像公共阶级狗的类继承:动物,我需要一些关于以下情况的“最佳实践”信息。

我有三个相同类型的类,名称和值不同。他们有一个层次顺序,所以一个是父母,第一个和第二个孩子。我们假设,每个类都应该有一个名为color的属性。

我创建一个父类的实例,并为其指定颜色“BLUE”。现在我创建一个相同类型的子节点,它应该通过引用父节点继承所有属性,只要没有特殊的值集。它不是克隆,因为我不想将值复制到新类中。所以父母的每一个变化都会自动显示在孩子身上。

所以我在第一个孩子下面创建一个新孩子 - 我没有为第一个孩子设置任何特殊颜色,所以我的第二个孩子也是“蓝色”。简而言之,它看起来像这样:

蓝色(父母) - >蓝色(Child1) - >蓝色(Child2)

现在我将Child1更改为“RED”:

蓝色(父母) - > RED(Child1) - > RED(Child2)

这是一种很好的方法,只能将差异存储到基础,所以在大型结构的情况下,我可以简单地节省存储空间。

这样的contruct / articles阅读/链接的最佳实践?

提前致谢

罗兰

2 个答案:

答案 0 :(得分:1)

不知道之前是否已经描述过,但我会这样设计:

首先,为每个类提供一个“属性集”。在C ++中,这可以是一个映射,将标识(字符串,数字,GUID,...)映射到一个值。

然后,给你的类一个像这样工作的getColor方法(这是不完整的代码,但应该足以让你开始):

PropertySet::const_iterator it = m_propertySet.find("Color");
// property found, return it
if (it!=m_propertySet.end()) return it->second;
// if property is not found, ask our parent
if (m_parent) m_parent->getColor();
// if no parent, return black
return BLACK;

虽然这有效,但这种方法存在一些缺陷:

  • 在属性集中查找值比仅返回数据成员要慢得多
  • 在属性集中使用字符串作为键很慢,但可以更容易区分属性
  • 在属性集中使用整数作为键要快得多,但可能会使区分属性变得更加困难
  • 属性集总是占用更多的内存,而不仅仅是存储一个数据成员,如果你有一个深层次结构,它可能只有很多属性,只有少数几个属性

答案 1 :(得分:0)

我认为这是Delegation Design Pattern的一个案例。

此类行为的实现取决于您使用的语言。基于原型的语言,如Javascript或Self,本机使用此机制。这意味着您可以在两个对象之间建立父子关系,并且子项立即继承所有父属性。当您更改父对象中的属性值时,您也会在其子对象中看到新值。如果更改子对象中的属性,则新值将存储在子对象中,而其父对象不会受到影响。

如果你使用像Java或C ++ / C#这样的语言,你通常会模仿这种行为,在对象(子)的成员变量中保存对另一个(其父)的引用,并在子的getter中放入要查找的必要逻辑存储在对象本身(在成员变量或映射中)的属性值,或者如果子节点无法自行解析属性,则将责任委托给其父节点。通常,child和parent都实现了一个公共接口,但我并不总是需要它。