- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
例如,每个人可以有多个 child ,但每个人必须有两个 parent 。然后说(在 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 中,子对象中的父引用会破坏封装并增加耦合。但是,如果子对象没有父对象没有意义,那么向子对象添加父引用是否正确?
最佳答案
I know that in OOP a parent reference in a child object breaks encapsulation…
不,它没有。如果来自外部的代码应该有理由关心存在这样的关系,那么允许来自外部的代码显示知道。代码不需要知道该关系是否由引用实现,事实上也不必如此。揭示这一点会破坏封装。
…and increases coupling.
啊,确实如此。
所以你需要:
如果你的类是不可变的,一个简单的快乐方式是你不在乎:当你收到一个 Human
它的 Mother
, Father
和/或 Children
属性是固定的和只读的,那么耦合也是固定的,不会伤害你。 (如果你有一个引用计数的垃圾收集,它可能会,但这是 .NET,所以你没有)。这不是您可能不关心的唯一方式,但它是一种方式。
否则你需要处理耦合。一种方法是仅让 Mother
和 Father
属性可从外部设置。考虑:
public class Human
{
private Human _mother;
private Human _father;
private HashSet<Human> _children;
public IEnumerable<Human> Children
{
// If paranoid, do a foreach … yield here to stop code casting back to `HashSet`
// Using ImmutableCollections and calling ToImmutableHashSet() is good too.
get { return _children; }
}
public Human Mother
{
get { return _mother; }
set
{
if(_mother == value) // skip for no-op
return;
if(_mother != null)
_mother._children.Remove(this);
if(value != null)
value._children.Add(this);
_mother = value;
}
}
public Human Father
{
get { return _father; }
set
{
if(_father == value)
return;
if(_father != null)
_father._children.Remove(this);
if(value != null)
value._children.Add(this);
_father = value;
}
}
}
这种方法通过在 Father
和 Mother
属性中处理耦合来处理耦合,并且仅在这些属性中进行处理。其他方法适用于其他情况,例如根本不存储这些属性的值,但有一种方法可以在调用属性时获取它们。
当然也可以让所有的 Mother
、Father
和 Children
属性都是可写的(以及通过访问 获得的集合 child
也是可写的)`并且仍然保持同步,这很难。它是否比必须的更难取决于应用程序。
而不是破坏封装,他们非常依赖它。
关于c# - 如果 child 没有 parent 就不能存在,那么 child 的 parent 引用是否合理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30546298/
我有一个曾经是 TreeView 控件的菜单,但现在我想让每个项目更加直观,并向树中的每个对象添加更多信息。 我的第一个意图是制作一个代表项目的用户控件,并在运行时将它们添加到面板中。这是一个好方法吗
我是 Docker 新手,想知道是否有可能(并且是一个好主意)在 Docker 容器中进行开发。我的意思是创建一个容器,执行 bash,安装和配置我需要的一切,然后开始在容器内进行开发。 容器将成为我
在 Java 中: Parent obj = new Child(); 我创建了一个 Parent 类型的对象。我假设我只能调用父类中定义的方法。因此,我无法调用 Child 中定义的“附加”方法或访
注意:我省略了其他两个阶段(V 和 W)的代码,示例中不需要。 我很确定,我这样处理“开”和“关”时间的方式并不是一种有效的方式。 我想使用查找表实现“开”和“关”脉动。计时器应与表的当前选定值进行比
当代码中包含 Java instanceof 运算符时,许多人会扬起眉毛并说这是禁忌。例如,在这个 other SO Q&A ,答案说: Note that if you have to use th
我是一名优秀的程序员,十分优秀!