我試圖創建一個事件委託其中參數是強類型匹配當前類靜態定義的成員,像這樣:使用動態確定類類型
public class HPCRequest
{
public delegate void RequestCompleteHandler(HPCRequest request);
public event RequestCompleteHandler RequestComplete;
的問題是,該點這個類是要繼承的,我真正想要的是所有這些繼承類有「RequestComplete」事件,其中委託類型的那個類:
public class HPCGetConfig : HPCRequest
{
//I want this class to effectively inherit something like this:
//public delegate void RequestCompleteHandler(HPCGetConfig request);
這是因爲,目前,當我有一個函數來處理我的一個「RequestCompl ETE」事件,我現在必須這樣做:
myGetConfigRequest.RequestComplete += new HPCRequest.RequestCompleteHandler(HPCGetExpectedLosses_RequestComplete);
void HPCGetConfig_RequestComplete(HPCRequest request)
{
HPCGetConfig thisRequest = request as HPCGetConfig;
//This should be strongly typed in the first place.
但我希望能夠做這樣的事情:
request.RequestComplete += new HPCGetConfig.RequestCompleteHandler(HPCGetConfig_RequestComplete);
request.SendRequestAsync();
}
void HPCGetConfig_RequestComplete(HPCGetConfig request)
{
request.RequestComplete -= HPCGetConfig_RequestComplete;
嘗試
我已經嘗試這樣:
public delegate void RequestCompleteHandler<T>(T request) where T : HPCRequest;
public event RequestCompleteHandler<T> RequestComplete;
但是當我嘗試使用RequestComplete(this);
基類中調用的情況下,我得到一個編譯時錯誤:'委託「RequestCompleteHandler」有一些無效的參數。
發生這種情況是否我設置整個HPCRequest
類作爲HPCRequest<T>
轉到:RequestComplete(this);
:
public class HPCRequest<T> where T : HPCRequest<T>
{
public delegate void RequestCompleteHandler<T>(T request);
public event RequestCompleteHandler<T> RequestComplete;
public class HPCGetConfig : HPCRequest<HPCGetConfig> { ...
當我嘗試調用事件發生同樣的錯誤我也嘗試過所有形式的創建委託和事件並覆蓋它們,例如在做:
public class HPCRequest
{
public delegate void RequestCompleteHandler(HPCRequest request);
public virtual event RequestCompleteHandler RequestComplete;
public sealed class HPCGetConfig : HPCRequest
{
public delegate void RequestCompleteHandler(HPCGetConfig request);
public override event RequestCompleteHandler RequestComplete;
但是,這給了我一個編譯時錯誤,因爲我不能用不同的委託類型的一個覆蓋RequestComplete事件。
還有其他想法嗎?
編輯
模板整個HPCRequest類是不是一種選擇,一個很徹底的嘗試之後,我發現它只是搞砸了一切努力,以使用類型HPCRequest作爲一個佔位符的任何請求類型。如果此解決方案正常工作,則類HPCRequest
必須能夠實例化並繼承而不指定類型參數。我將需要一個不需要模板的解決方案HPCRequest
。
爲了確保每個人都知道我究竟如何我試圖用這個,我粘貼一些示例代碼到引擎收錄的是應該讓你實驗,獲得本次活動的模板不破壞任何東西的工作方式。這裏是:http://pastebin.com/bbEYgLj1
這似乎是朝着正確方向邁出的一步,但假設HPCRequest是抽象的是錯誤的。該類的** main **點將被繼承,但它可以被實例化,並且包含某些方法的實現。當我嘗試使用下列方法調用它的RequestComplete事件:'if(RequestComplete!= null)RequestComplete(this);' - 我得到一個錯誤:'Delegate RequestCompleteHandler有一些無效的參數。' – Alain
我可以支持基類嗎?定義如下:'public class HPCRequest:HPCRequest {}'? \ *編輯\ *我不這麼認爲,因爲那時我的其他類不能再轉換成這個類。 –
Alain
如果您想跟進,我已經編輯了這個問題。 – Alain