我目前正致力于将一些Visual Basic .NET代码移植到c#.NET,并且我正在移植的库中有一个特定部分是我无法看到的去上班。下面是它是如何布局:通过使用事件的表单类实现接口
首先,我有一个接口定义如下:
public interface IMyInterface
{
void EnableSave(object sender, EventArgs e);
}
接下来,我有一个实现上述接口的继承形式:
public partial class frmIMyInterface : Form, Globals.IMyInterface
{
public delegate void EnableFormSaveEventHandler(object sender, EventArgs e);
public event EnableFormSaveEventHandler EnableFormSave;
public void EnableSave(object sender, EventArgs e)
{
EnableFormSave.Invoke(sender, e);
}
}
到目前为止好。然后,我创建一个实现frmIMyInterface形式:
public partial class frmMyNewForm : frmIMyInterface
{
...
在这种形式,我已经定义了处理事件的方法:
private void EnableSave(object sender, EventArgs e)
{
this.cmdSave.Enabled = true;
}
然后,在窗体的设计代码,处理程序委托定义如下:
this.EnableFormSave += new frmIMyInterface.EnableFormSaveEventHandler(this.EnableSave);
我的项目通常建立,但是,当我尝试打开frmMyNewForm
与窗体设计器,我得到一个闪屏,上面写着:“为了避免在加载设计器之前可能会丢失数据,必须解决以下错误:Method'EnableSave'不能作为事件的方法,因为此类派生的类已经定义了该方法。“
我移植的VisualBasic.NET代码已经完全按照我的定义进行了定义,但工作正常。我看不到任何问题,并且似乎.NET应该知道引发事件的基类中的方法定义与作为事件处理程序设置的派生形式中定义的处理程序之间的区别。
预先感谢您!
你的frmMyNewForm有*两个* EnableSave()方法。它从基类继承而来的另一个私有类。如果您打算这么做,您也会收到警告,建议使用* new *关键字。你不想这样做,没有意义。您还在frmIMyInterface.EnableSave()方法中犯了一个错误,当没有事件处理程序订阅该事件时,它会崩溃并烧毁。它也不遵循事件引发模式,它应该是一个名为OnEnableSave()的受保护的虚拟方法。请记住,C#不像VB.NET。 –