首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决循环引用?

如何解决循环引用?
EN

Stack Overflow用户
提问于 2011-08-03 22:48:50
回答 6查看 54.5K关注 0票数 30

如何解决循环引用问题,比如类A将类B作为其属性之一,而类B将类A作为其属性之一?

如何做架构师来解决这些问题?

以NHibernate为例,对象之间将存在父子关系。

它如何处理这些父子场景?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-08-04 00:14:53

在大多数情况下,当我不得不让两个对象相互引用时,我会创建一个接口来删除循环引用。例如:

之前的

代码语言:javascript
复制
public class Foo
{
    Bar myBar;
}

public class Bar
{
    Foo myFoo;
}

依赖关系图:

代码语言:javascript
复制
Foo     Bar
 ^       ^
 |       |
Bar     Foo

Foo依赖于Bar,但Bar也依赖于Foo。如果它们位于不同的程序集中,您将在构建时遇到问题,特别是当您进行干净的重新构建时。

之后的

代码语言:javascript
复制
public interface IBar
{
}

public class Foo
{
    IBar myBar;
}

public class Bar : IBar
{
    Foo myFoo;
}

依赖关系图:

代码语言:javascript
复制
Foo, IBar     IBar
    ^          ^
    |          |
   Bar        Foo

Foo和Bar都依赖于IBar。没有循环依赖,如果将IBar放在自己的程序集中,那么Foo和Bar位于不同的程序集中将不再是问题。

票数 45
EN

Stack Overflow用户

发布于 2011-08-03 22:51:02

我会告诉你的朋友他需要重新考虑他的设计。像您所描述的循环引用通常是设计缺陷的代码味道。

票数 7
EN

Stack Overflow用户

发布于 2011-08-03 22:52:51

与C++不同(例如),C#不需要转发声明来解析循环引用。因此:

代码语言:javascript
复制
public class A
{
    public B B { get;set; }
}

public class B
{
    public A A { get;set; }
}

然而,这通常是一个有问题的设计决策的指标。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6928387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档