我有个关于面向对象编程的问题:
    假如有两个对象A和B:对象A有一个按钮。当触发该按钮事件后,会调用对象B实例的某方法。那应该怎么写这个程序最好?

解决方案 »

  1.   


    class A
    {
     B b;
     Button button1;
     public A()
     {
      ///
      A.button1.Click+=new EventHandle(b.Function);
     }class B
    {
     public void Funciton(object sender, EventArgs e)
     {
      ///
     }
    }
      

  2.   

    protected void btn1_Click(object sender,eventargs e)
    {
    //dosomething;
    btn2_click(sender,e);
    }
    这样就也干了按钮2的事情了!
      

  3.   

    两个条件要考虑:1. 对象A是如何知道对象B的,要想清楚它们各自的生命周期、操作序列,从“历史”中去了解它们各自“是什么”(其实对象就是对“何物存在”这个问题的回答)。不要从编程角度,要从应用角度,抛开编程。2. 要仔细研究B的接口规范。如果有,A就能跟B通讯。如果没有,那么就需要改变设计。
      

  4.   

    如果对象A中有引用对象B实例,那么就在A的按钮事件中直接调用B的那个方法就行了。
      

  5.   

    Funciton(object sender, EventArgs e)
     {
      ///
     }
    }这样classA有一个实例,classB有2个实例,那么按classA则怎么知道调用classB中的哪个实例??
      

  6.   

    你所说的事件的问题,其实跟对象之间通讯没有关系。A对象的View触发了事件,它只是通知自己的Control,而至于Control干什么(与B通讯)并不跟事件有关。A的功能跟B的功能之间,才是它们功能之间的关系,没有表现层也不影响功能。
      

  7.   


    我就不想这样做,这样做就必须有B实例。
    我的意思是:两个对象是存在一定关系的~对象A发生某事件,可以控制对象B~但是不是实例B。
      

  8.   


    就如sp1234所说的,这也得看A和B窗口之间是什么关系,才能决定该如何实现,这里就存在三种情况
    1. A包含B的对象
    public class A : Form
        {
            private B b;
            public A()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                // 直接调用b的close方法
                b.Close();
            }
        }    public class B : Form
        {
            public B()
            {
                InitializeComponent();
            }
        }2. B中包含A的对象
    public class A : Form
        {
            // 定义button按下后发出的事件,供B接收
            public delegate void ButtonClick(object sender, EventArgs e);
            public event ButtonClick Click;        public A()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                // 触发Click消息
                if (Click != null)
                    Click(sender, e);
            }
        }    public class B : Form
        {
            private A a;        public B()
            {
                InitializeComponent();            // 注册A的Click事件
                a.Click += new A.ButtonClick(a_Click);
            }        void a_Click(object sender, EventArgs e)
            {
                this.Close();
            }
        }3. A和B互不包含
    这时我们需要使用一个中间类C来实现两个Form类的关联
    public class A : Form
        {
            public A()
            {
                InitializeComponent();
            }        public void button1_Click(object sender, EventArgs e)
            {
                C.Instance.HandleAButtonClick();
            }
        }    public class B : Form
        {
            public B()
            {
                InitializeComponent();            C.Instance.Click += new C.ButtonClick(c_Click);
            }        void c_Click(object sender, EventArgs e)
            {
                this.Close();
            }
        }    public class C
        {
            public delegate void ButtonClick(object sender, EventArgs e);
            public event ButtonClick Click;        public void HandleAButtonClick()
            {
                if (Click != null)
                    Click(null, EventArgs.Empty);
            }        public static C Instance = new C();
        }