- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 C#.NET 解决业务问题。我有两个类,名为 C 和 W,它们将在不同时间独立实例化。
C 类的对象需要包含对 W 类的 0 ... n 个对象的引用,即一个 C 对象最多可以包含 n 个 W 对象。
每个 W 对象都需要包含对 1 个类 C 对象的引用,即一个 W 对象包含在一个 C 对象中。
通常首先实例化 C 类的对象。稍后,发现并实例化其 W 内容。稍后,我需要将 C 和 W 对象相互交叉引用。
什么是好的设计模式?实际上,我遇到过涉及三个或四个类的案例,但我们可以讨论两个类以保持简单。
我在想一些简单的事情,比如:
class C
{
public List<W> contentsW;
}
class W
{
public C containerC;
}
这暂时可行,但我可以预见必须编写大量代码来跟踪所有引用及其有效性。我想在以后实现代码,只对容器进行浅刷新,对所有引用的类进行深度刷新。还有其他方法吗?它们的优点是什么?
11/3 编辑:感谢大家的良好回答和良好的讨论。我最终选择了 jop 的答案,因为它最接近我想做的,但其他答案也有帮助。再次感谢!
最佳答案
如果您有 Martin Fowler 的重构书,只需按照“将单向关联更改为双向”重构即可。
如果您没有它,下面是您的类在重构后的样子:
class C
{
// Don't to expose this publicly so that
// no one can get behind your back and change
// anything
private List<W> contentsW;
public void Add(W theW)
{
theW.Container = this;
}
public void Remove(W theW)
{
theW.Container = null;
}
#region Only to be used by W
internal void RemoveW(W theW)
{
// do nothing if C does not contain W
if (!contentsW.Contains(theW))
return; // or throw an exception if you consider this illegal
contentsW.Remove(theW);
}
internal void AddW(W theW)
{
if (!contentW.Contains(theW))
contentsW.Add(theW);
}
#endregion
}
class W
{
private C containerC;
public Container Container
{
get { return containerC; }
set
{
if (containerC != null)
containerC.RemoveW(this);
containerC = value;
if (containerC != null)
containerC.AddW(this);
}
}
}
请注意,我制作了 List<W>
私有(private)的。通过枚举器公开 Ws 的列表,而不是直接公开列表。
例如公共(public)列表 GetWs() { 返回 this.ContentW.ToList();
上面的代码正确地处理了所有权的转移。假设您有两个 C 实例——C1 和 C2——以及 W 实例——W1 和 W2。
W1.Container = C1;
W2.Container = C2;
在上面的代码中,C1 包含 W1,C2 包含 W2。如果将 W2 重新分配给 C1
W2.Container = C1;
然后 C2 将有零个项目,C1 将有两个项目 - W1 和 W2。你可以有一个 float 的W
W2.Container = null;
在这种情况下,W2 将从 C1 的列表中删除,并且它将没有容器。您还可以使用 C 中的添加和删除方法来操作 W 的容器 - 因此 C1.Add(W2) 会自动从其原始容器中删除 W2 并将其添加到新容器中。
关于c# - 对于需要引用其他类的类,C# 中的良好设计模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/249171/
嗨,我正在考虑开发一种文件传输程序,想知道我是否想要尽可能好的加密,我应该使用什么? 我会用 C# 开发它,所以我可以访问 .net 库 :P在我的 usb 上有一个证书来访问服务器是没有问题的,如果
我创建的这个计算两个数组的交集是线性的方法的复杂度(在良好、平均、最差的情况下)? O(n) public void getInt(int[] a,int[] b){ int i=0; int
我已经能够使用 RTCPeerConnection.getStats() API 获得 WebRTC 音频调用的各种统计信息(抖动、RTT、丢包等)。 我需要将整体通话质量评为优秀、良好、一般或差。
基本问题: 如果我正在讲述/修改数据,我应该通过索引硬编码索引访问文件的元素,即 targetFile.getElement(5);通过硬编码标识符(内部翻译成索引),即 target.getElem
在 Linux 上,我想知道要调用什么“C”API 来获取每个 CPU 的统计信息。 我知道并且可以从我的应用程序中读取 /proc/loadavg,但这是系统范围的负载平均值,而不是每个 CPU 的
在客户端浏览器中使用 fetch api,GET 或 POST 没有问题,但 fetch 和 DELETE 有问题。它似乎将 DELETE 请求方法更改为 OPTIONS。 大多数研究表明是一个cor
我是一名优秀的程序员,十分优秀!