我目前正致力於將一些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。 –