我有一个包含属性列表的类,属性本身有一个属性列表。我需要“孙子” - 属性能够从它的父母的父母那里请求数据(对于令人困惑的条款 - 这里没有继承,对不起)。澄清:
class ClassA
{
list<ClassB> Children
var SomeOtherProperty
}
class ClassB
{
list<ClassC> Grandchildren
}
class ClassC
{
var GetSomeOtherProperty()
{
...
}
}
数据可能会在运行时更改,因此我不能只传递一次并完成它,我必须能够动态获取它。
我总是可以将父母一直传给ctors的孙子,但我被教导这是一种不好的做法,所以我宁愿避免它。
我一直在阅读有关使用可变EventArguments通过事件向后/向下传递数据的信息 - 我想知道这对我所拥有的是否是一个好的解决方案(我每次需要做两次 - 有点追逐第一个事件的尾巴)。我需要注意哪些陷阱?
对于这种情况,我还有其他选择吗?
谢谢!
答案 0 :(得分:0)
如果可能,您可以使用设计模式合成。首先,创建一个基类&#39;注意&#39;带有孩子的笔记列表和虚拟方法&#39; DoAction&#39;。然后从该类派生所有其他类,并使用自己的实现覆盖该方法。
现在你可以建立一个笔记树,并对所有孩子进行遍历。对于他们每个人,请致电&#39; DoAction&#39;
希望你能得到这个想法......
答案 1 :(得分:0)
由于A,B和A类通过继承不喜欢C,因此,我希望避免这些类之间的任何直接连线,因为它会使设计变得有点复杂,因为系统会发展。
此外,由于B类与数据无关,我不希望它受到它的影响。
因此,我想通过一条单独的路线进行沟通,以保持课程松散耦合 -
这是一个解释我的想法的示例代码 -
public interface IPublisher
{
event EventHandler OperationOccurred;
}
class ClassA : IPublisher
{
List<ClassB> Children;
event EventHandler OperationOccurred;
public ClassA()
{
BroadCaster.Instance.RegisterPublisher(this);
}
protected virtual void OnOperationOccurred()
{
if (OperationOccurred != null)
OperationOccurred(this, new EventArgs());
}
}
class ClassB
{
List<ClassC> Grandchildren;
}
class ClassC
{
public ClassC()
{
BroadCaster.Instance.BroadCastNotificaiton += Instance_OperationOccurred;
}
void Instance_OperationOccurred(object sender, EventArgs e)
{
throw new NotImplementedException();
}
}
/// <summary>
/// A singleton class ... Like a single braodcast tower just one in the city
/// </summary>
public sealed class BroadCaster
{
public static BroadCaster Instance { get; private set; }
//Static constructor
static BroadCaster()
{
Instance = new BroadCaster();
}
// private constructor
private BroadCaster(){}
public event EventHandler BroadCastNotificaiton;
public void RegisterPublisher(IPublisher publisher)
{
publisher.OperationOccurred += Publisher_OperationOccurred;
}
void Publisher_OperationOccurred(object sender, EventArgs e)
{
if (this.BroadCastNotificaiton != null)
this.BroadCastNotificaiton(sender, e);
}
}
我已经实现了广播公司的单身对象,但我想传达的只是一个单一的沟通点。
希望它有所帮助。