2012-04-19 73 views
3

我一直拉我的头发一段时间C#在表单中继承一个类

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

我不想让picturebox1公开。 等东西如 Class1 classOne = new Class1(); pictureBox1.Click + = new EventHandler(cs.pictureBox1_Click);不管用。我不确定如何让form1.cs继承class1.cs。只是在心理空白

的声音在我的头上,但我太容易我已经厌倦了Form1类:表格,Class1的

在Form1.Designer.cs this.pictureBox1.Click + =新System.EventHandler(这一点。 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"); 
    } 
} 
+1

C#不支持多类继承,所以Form1可以继承Form或Class1,但不能同时继承。您可以使Class1继承Form,然后Form1继承Class1。 – ulty4life 2012-04-19 01:21:52

回答

0

你不需要让图片框本身的公众,但你需要做的事件处理程序到Class公众,使他们能够在其他地方访问。

我真的不明白你应该特别要求继承的原因。看看here了解更多信息。

2

Class1应该Form继承,然后Form1将从Class1继承:

class Class1 : Form 
{ 
    //... 
} 

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

确保所有partial声明从Class1继承,而不是从Form。 (这可能会为任何自动生成的代码添加额外的步骤,这是partial类的经典原因。您可能需要为此编写自己的自动化)。试图通过具有FormForm1之间的中间类型来实现。 Class1应该是一个通用的“基本形式”,多种形式将继承?还是你想要做别的事情?但是,如果您希望Form1能够访问Class1的成员而不将它们暴露为public成员,则可以改为protected

+0

我认为它解决了眼前的问题,但使长期问题变得更糟。 – 2012-04-19 01:30:28

+0

@KendallFrey:很可能,是的。我认为OP需要退后一步,更清楚地确定在这种情况下继承的必要性。就我个人而言,我发现缺乏经验的开发人员严重过度使用继承作为一种工具,最终导致矛盾的是,非面​​向对象的设计。 – David 2012-04-19 01:32:28

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事件的外部对象。你应该重新评估你的代码想想究竟是你试图做什么。

3

继承定义了一个'是'的关系,所以除非Form1 是-al Class1,那么你没有以正确的方式接近它。你真的取决于你想要什么样的设计几个选项:

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

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

这是一个继承vs遏制的问题。有关这方面的更多信息,以这种方式说出问题。

1

只有这样,你可以通过改变将Class1.cs如下

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

你Form1上是一个类实现它,所以只是从Form1中继承窗体2。 (而不是试图将部分复制回一些新的Class1.cs文件)Form1.designer.cs仍然是Form1定义的一部分,只是为了图形表单设计者的目的而放在一边。但请注意,定义中没有其他部分(甚至没有设计师!Iy都在那里!)。

此外,您不必将这些类设置为公开的,以使pictureboxes在内部可以访问相同的程序集。

选项:您可以在Form1中创建自己的事件,也可以创建abstractvirtual方法来处理Form1的事件发生与像Form2这样的子类。

这有帮助吗?

0

您可以始终使用一个接口。关键是你只能从一个类继承,但是有很多接口......所以我假设你需要这样一个接口 - 将方法传递给其他任何接口。远离界面,你总是可以把你的类作为参数传递给第二类Form的构造函数(使用'this'关键字),这样你就可以很容易地传递值,从以前的表单的方法让我们说到另一个(例如事件)。