C#在表单中继承一个类

时间:2012-04-19 01:17:32

标签: c# inheritance

我已经把头发拉了一段时间

我创建了一个充满图片框的表单。每个图片框都包含一个_click,_mousedown和_mouseup事件。我希望将为表单创建的这些事件移动到class1.cs中,然后让form1.cs继承这些事件。

我不希望将picturebox1公之于众。 所以像 Class1 classOne = new Class1(); pictureBox1.Click + = new EventHandler(cs.pictureBox1_Click);不行。

我不确定如何使form1.cs继承class1.cs。听起来很容易,但我只是心理上的空白

我累了上课Form1:Form,Class1

在Form1.Designer.cs中this.pictureBox1.Click + = new System.EventHandler(this.pictureBox1_Click); 无法访问this.pictureBox1_Click

如果你能直接指出我,那将是一个很大的帮助!干杯

Form1.cs
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
}

Class1.cs 
class Class1
{

    private void pictureBox1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("pb1 click");
    }
 }

7 个答案:

答案 0 :(得分:3)

继承定义了'is-a'关系,所以除非Form1 是-a Class1,否则你不会以正确的方式接近它。根据你想要设计的内容,你真的有几个选择:

  1. 通过公共方法将表单传递给类实例,让类附加事件处理程序(如果有多个共享行为的表单,这似乎在这些情况下更有意义。)

  2. 在表单中存储常见行为(作为特殊类型的表单PictureClickingForm),然后让其他表单继承该行为。现在可以保护方法。

  3. 这是继承与遏制的问题。当以这种方式表达问题时,有关此问题的更多信息。

答案 1 :(得分:2)

Class1应继承自Form,然后Form1将继承自Class1

class Class1 : Form
{
    //...
}

public partial class Form1 : Class1
{
    //...
}

确保所有partial声明都从Class1继承,而不是从Form继承。 (这可能会为任何自动生成的代码添加额外的步骤,这是partial类的经典原因。您可能需要为此编写自己的自动化。)

我不清楚您要通过在FormForm1之间设置中间类型来实现的目标。 Class1应该是多个表单将继承的通用“基本表单”吗?或者你想尝试别的什么?但是,如果您希望Form1能够访问Class1成员而不将其作为public成员公开,则可以改为protected

答案 2 :(得分:1)

只有这样才能通过更改Class1.cs来实现它

public partial class Form1
{
    private void pictureBox1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("pb1 click");
    }
 }

答案 3 :(得分:0)

您不需要将Picture Box本身公开,但您需要在Class1中公开事件处理程序,以便可以在其他地方访问它们。

我真的没有理由要在这里明确要求继承。请查看here以获取更多信息。

答案 4 :(得分:0)

您要从Form1订阅Class1个活动吗?尝试这样的事情:

//Form1.cs
public partial class Form1 : Form
{
    Class1 class1;

    public Form1()
    {
        InitializeComponent();
        class1 = new Class1();
        this.pictureBox1.Click += new EventHandler(class1.pictureBox1_Click); 
    }
}

//Class1.cs 
class Class1
{

    private void pictureBox1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("pb1 click");
    }
}

看起来你要做的不是继承,而是简单地通知GUI事件的外部对象。您应该重新评估您的代码,考虑完全您正在尝试做什么。

答案 5 :(得分:0)

您的Form1是一个类,所以只需从Form1继承Form2。 (而不是尝试将部件复制回一些新的Class1.cs文件)Form1.designer.cs仍然是Form1定义的一部分,只是为了图形表单设计器的目的而移到一边。但请注意,定义中没有其他部分(即使是设计师也没有!我就在那里!)。

此外,您不必将类公开,以使图片框可在内部访问同一个程序集。

选项:您可以在Form1中创建自己的事件,或者您可以使用类似Form2的子类创建abstractvirtual方法来处理Form1的事件发生。

这有帮助吗?

答案 6 :(得分:0)

您可以始终使用接口。关键是你只能从一个类继承,但是很多接口......所以我假设你需要这样的接口 - 传递方法或者其他什么。远离接口,你总是可以将你的类作为参数放到第二个类Form的构造函数中(使用'this'关键字),这样你就可以传递值,从以前的Forms中获取的方法可以说是另一个(例如也是事件)。