问题是这样的,我设计了一个窗体Form1,在这个窗体上放置了很多控件,发现后面的窗体要实现的功能跟Form1比较类似,于是就是用了继承窗体,让Form2继承自Form1。文件就接着来了,当我想在Form2中对继承过来的控件进行操作的时候,例如点Form2中的button按钮,这样form1窗体的button按钮的事件也会执行一次。我想知道怎样才能实现form2窗体的事件只执行一次呢。关键是Form2中的事件和Form1中的控件的事件比较类似,又不想重新写这些代码,是不是可以新建一个类,然后将这些方法作为这个新建类的静态方法,然后从Form1和Form2中分别调用呢,这样应该能够实现。但是我有怀疑这些事件还是会在Form1和Form2中各执行一次。应该是父类和之类方法调用方面的问题,是不是要用什么override来覆盖掉父类的方法呢。
ps:我将使用到的Form1窗体的控件的modify属性由原来的private转换成public了。
请各位高手指教。

解决方案 »

  1.   

    public class Base
      {
      public void test()
      {
      Console.WriteLine("base");
      }
      }  public class Child: Base
      {
      public new void test()
      {
      Console.WriteLine("child");
      }
      }
      static void Main(string[] args)
      {
      Child c= new Child();
      c.test(); 
      ((Base)d).test(); 
      } 
      

  2.   

    既然form2继承自form1,那么你的form2“也就是一个form1”,这才叫做继承。如果你继承自form1,又要阻止form1的行为,要多多反思自己是不是滥用了继承。如果滥用了继承,纠正的方法是把核心内容抽出成为user control,然后form1和form2分别组合使用这个控件,每一个(类)form分别以不同的流程处理这个控件抛出的事件。如果确实非常类似,以至于确实可以以假乱真地用“也就是”来解释继承关系,那么你就能在原来对form1的设计中顺畅地增加一种对于控制流程的解释,使用给它设置的属性来控制原来form1所执行的事件行为。
      

  3.   

    不要因为想偷懒少写一些代码于是滥用继承。继承必须用在即使是不懂软件的外行也可以毫不需要费力解释就能立刻理解父类跟子类对象之间具有“就是(Is A)”这种逻辑关系的地方,把子类的对象实例直接放到父类对象的自动测试程序中应该顺畅地执行而不会出现bug。滥用继承,是要被嘲笑的。
      

  4.   

    猜想你的Form1中的按钮已经绑定了事件,而子类Form2又添加了新的事件,故出现一个动作两个反应的现象
    解决的办法是弄一个抽象基类Form0,不绑定事件,再分别继承出Form1和Form2绑定不同的事件即可
    楼上的那位大侠居然在回贴中使用了嘲笑的字眼,有这么严重么?不懂就问会让人嘲笑?正所谓不耻下问乃君子!
      

  5.   

    我实际上在解释为什么会产生“滥用继承”这种理论判断。如果无关痛痒的地方,我才懒得在csdn这种地方来说。没有什么必要说的小东西,我在我公司里给新人用半分钟做个样子不就行了?!
      

  6.   

    public class Form1:System.Windows.Forms.Form
    {
        public System.Windows.Forms.Button button1 = new System.Windows.Forms.Button();
        public Form1()
        {
            button1.Text = "Button1";
            this.Controls.Add(button1);
            button1.Click += new System.EventHandler(button1_Click);
        }    protected virtual void button1_Click(object sender, System.EventArgs e)
        {
            System.Windows.Forms.MessageBox.Show("Form1.button1 clicked.");
        }
    }public class Form2 : Form1
    {
        protected override void button1_Click(object sender, System.EventArgs e)
        {
            //base.button1_Click(sender, e);//调用父类方法,注释或删除
            System.Windows.Forms.MessageBox.Show("Form2.button1 clicked.");
        }
    }给你例子,看看就明白了。
      

  7.   

    既然Form2中的事件和Form1中的控件的事件比较类似,那可以制作一个控件user control,两个窗体都调用这个控件,通过不同的属性来控制流程,这样也比较好理解一点吧
      

  8.   

    public class Form1:System.Windows.Forms.Form
    {
        public System.Windows.Forms.Button button1 = new System.Windows.Forms.Button();
        public Form1()
        {
            button1.Text = "Button1";
            this.Controls.Add(button1);
            button1.Click += new System.EventHandler(button1_Click);
        }    protected virtual void button1_Click(object sender, System.EventArgs e)
        {
            System.Windows.Forms.MessageBox.Show("Form1.button1 clicked.");
        }
    }public class Form2 : Form1
    {
        protected override void button1_Click(object sender, System.EventArgs e)
        {
            //base.button1_Click(sender, e);//调用父类方法,注释或删除
            System.Windows.Forms.MessageBox.Show("Form2.button1 clicked.");
        }
    }