通过属性渗透数据

时间:2015-11-20 19:22:24

标签: c# .net events event-handling

我有一个包含属性列表的类,属性本身有一个属性列表。我需要“孙子” - 属性能够从它的父母的父母那里请求数据(对于令人困惑的条款 - 这里没有继承,对不起)。澄清:

class ClassA
{
 list<ClassB> Children
 var SomeOtherProperty
}

class ClassB
{
list<ClassC> Grandchildren
}

class ClassC
{
 var GetSomeOtherProperty()
 {
  ...
 }
}

数据可能会在运行时更改,因此我不能只传递一次并完成它,我必须能够动态获取它。

我总是可以将父母一直传给ctors的孙子,但我被教导这是一种不好的做法,所以我宁愿避免它。

我一直在阅读有关使用可变EventArguments通过事件向后/向下传递数据的信息 - 我想知道这对我所拥有的是否是一个好的解决方案(我每次需要做两次 - 有点追逐第一个事件的尾巴)。我需要注意哪些陷阱?

对于这种情况,我还有其他选择吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果可能,您可以使用设计模式合成。首先,创建一个基类&#39;注意&#39;带有孩子的笔记列表和虚拟方法&#39; DoAction&#39;。然后从该类派生所有其他类,并使用自己的实现覆盖该方法。

现在你可以建立一个笔记树,并对所有孩子进行遍历。对于他们每个人,请致电&#39; DoAction&#39;

希望你能得到这个想法......

答案 1 :(得分:0)

由于A,B和A类通过继承不喜欢C,因此,我希望避免这些类之间的任何直接连线,因为它会使设计变得有点复杂,因为系统会发展。

此外,由于B类与数据无关,我不希望它受到它的影响。

因此,我想通过一条单独的路线进行沟通,以保持课程松散耦合 - enter image description here

这是一个解释我的想法的示例代码 -

       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);
        }



    }

我已经实现了广播公司的单身对象,但我想传达的只是一个单一的沟通点。

希望它有所帮助。