gpt4 book ai didi

c# - 对于需要引用其他类的类,C# 中的良好设计模式是什么?

转载 作者:太空狗 更新时间:2023-10-29 20:06:45 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com