是否存在继承数据/对象的模式或标准术语?(注:此为提问标题,不需要回答)

3
我有一个A类,其中包含B类对象的集合。A类还可以从其他A类实例“继承”(缺乏更好的术语)B类对象的集合。为了建模,A类实例指向其他A类实例(我控制循环引用)。
一个简化的具体例子可能是一个人有生物孩子,但也从配偶和前配偶那里“继承”孩子。
在我的应用程序中,我在运行时使用带有和不带有继承对象的A类实例。也就是说,在不同的场景下,“A类实例”的两个“投影”对我都有意义。
我的问题是,是否有一种编码模式或标准术语来编写这种模型?我认为“继承”不是正确的词。我有自己处理技术方面的方法和自己笨重的术语,但我想象中有一种标准模式我可以遵循,但似乎找不到。
一个不完美的类比是检查带有和不带有其继承方法的.NET类的方法,或者在JavaScript中检查原型,但在这里,我正在“继承”记录/对象。

2
听起来像是委托模式,但是针对的是数据而不是行为。 - Tobu
Tobu,你说得非常好,感谢你理解问题并保持重点。我想知道是否有将该模式应用于数据的方法。 - bglenn
4个回答

2
看起来对我来说是 组合模式,其中A对象是复合体,B叶子。指向其他对象A的一个对象A是根项目。不同之处在于获取叶子项时,您可以区分根项是否包括它知道的其他复合项的叶子项。

这很有趣,我需要研究一下模式,然后再回复。 - bglenn

1

不,我认为(A)没有常见的面向对象编程习语适用于你正在做的事情,也没有(B)类似于你的突出模式。并且(C),这完全没问题。现在也许你应该这样做,也许不应该这样做。每当你做一些难以描述的事情时,你一定要反复思考并想知道是否有更简单的方法来完成它。但是,缺乏描述你的模型的常见术语,并且它不符合你所听说过的“模式”,本身并不意味着存在问题。类有时必须在幕后做奇怪的事情。这就是重点。如果您将大量复杂性封装到这些类的消费者中,并且对于他们来说具有直观性、逻辑性和可发现性,那就太好了!

然而,错误使用常用术语试图帮助别人理解是错误的。事实上,你上面使用的继承一词真的让我感到困惑,我仍然不确定我是否已经理解了它。是这个吗?

ClassA类的一个对象维护了一组ClassB对象。此外,ClassA对象的某些功能不仅要作用于自己的ClassB对象,还要作用于其他ClassA对象维护的ClassB对象。为此,ClassA对象维护对其他ClassA对象的引用。

如果我理解正确的话,我认为这是一个很好的描述方式。由于这里完全没有继承,如果使用该术语会让人们感到困惑。此外,如果你所做的事情与某个“模式”不匹配,请不要感到沮丧。


是的,你基本上捕捉到了我所描述的内容(尽管这只是针对我的用例,ClassA对象仅维护对其他ClassA对象的只读引用)。你是正确的,在这里使用“继承”一词是危险的,这就是为什么我将其放在单引号中(我应该解释为什么它在单引号中;我的疏忽)以及为什么我正在寻找更标准的术语来在我的项目中使用。你的更一般性的评论非常好。我想我会打印你的帖子,并在怀疑时参考它,睡得更好。 - bglenn
如果没有人能引用一个模式,我会将其标记为答案。我认为这种用例应该是相当常见的,并且被记录在某个地方作为一种模式。我很惊讶。 - bglenn

0

我认为你的模型有问题。如果一个类的两个或两个以上实例与另一个类的一个实例有关系,正确的模型不是使其中一个实例包含第三个实例,而是使它们引用第三个实例。在父母的情况下,每个人都应该引用同一个“后代”(人类孩子列表)对象。然后,您可以通过诸如引用计数之类的机制控制所引用的类。


我的问题中没有包含单词“contain”。如果您愿意,可以将关系称为“refers”。这是相同的基础模型。撇开语义不谈,我不知道引用计数的相关性是什么。您能详细说明一下吗?您指的是某种模式吗? - bglenn

0

OOP 定义了两种基本关系:

  1. A 是一个 B
  2. A 有一个 B

在第二类中,你有子类别:

  • A 包含 B
  • B 是 A 的 组成部分
  • A 与 B 相关联(或 引用

前两个相似,但你的具体例子明显指的是第三个。父母不包含孩子,他们与孩子有关系,当有人嫁入家庭时,他们会与现有家庭建立新的关系(关联)。

所以我想答案是否定的,没有“模式”。你只是从一个实例复制/转换一组关系到另一个实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接