【发布时间】:2015-06-24 22:14:51
【问题描述】:
例如,每个人可以有多个孩子,但每个人必须有两个父母。然后说(在 C# 中)是否合理
class Human {}
class Father : Human
{
List<Child> Children {get; set;}
}
class Mother : Human
{
List<Child> Children {get; set;}
}
class Child : Human
{
Mother Mother {get; set;}
Father Father {get; set;}
}
(另一个例子是一本书的页面——一本书可以有多个页面,但一个页面必须属于一本书且仅属于一本书,假设我们不引入从书中撕页、添加页面等的概念)
我知道在 OOP 中,子对象中的父引用会破坏封装并增加耦合。但是,如果子对象没有父对象没有意义,那么为子对象添加父引用是否正确?
【问题讨论】:
-
人类不必是母亲。因此,您可以创建一个类
Human,从它派生一个Mother,从Human派生一个Child。Child是一个Human,但它有一个Mother,因此它应该有一个Mother属性。Mother可以有多个Child,因此它应该有一个属性List<Child>。 -
谢谢,确实比较合适。更新了问题。
-
实际上我想说的是,在语义的情况下,父 (
Father/Mother) 应该持有Human的列表,而不是Child。假设Human父母有Human孩子,这些孩子自己可以变成Father或Mother。孩子的父母也是如此(应该是Human,因为父母是某些人的孩子)这消除了循环依赖,尽管您所做的事情在技术上没有任何问题,并且在某些情况下是描述对象的完全合法的方式。跨度> -
我不一定看到为母亲、父亲或孩子开设课程的价值。一个母亲有她自己的母亲,所以她应该被实例化为哪个类类型;母亲还是孩子?您可以简单地让 Human 类具有持有这些引用的母亲/父亲的属性,以及一个子列表。可能有名为
IsFather和IsMother的属性根据子列表中的子数返回真/假... -
@Idle_Mind 如果应用程序的任务是处理一组未成年人,
Father和Mother将作为与他们有特定关系的人存在(尽管他们可能没有监护权,或者他们可能是其他监护人也必须考虑)。虽然通常不明智,但它可能存在于特定应用中。