2017-05-06 118 views
1

我想定義非泛型委託延伸的泛型委託來定義泛型委託類型參數的默認,即是這樣的(不是有效的一段C#代碼,但一個明顯易懂的插圖概念我的意思是希望):如何在C#中使用非泛型委託類型擴展泛型委託類型?

public delegate void MyDelegate<T>(T arg); 

public delegate void MyDelegate(object arg) : MyDelegate<object>; 

什麼是,如果有的話,正確的方式來聲明呢?

不用說,我可以只申報2個獨立的代表達到幾乎同樣的效果這樣的方式:

public delegate void MyDelegate<T>(T arg); 

public delegate void MyDelegate(object arg); 

,但我想這樣做,使他們之間的實際關係(其實裸MyDelegate型是指等於MyDelegate<object>,就像一個類擴展另一個類或直譯)明確的方式,使下面的代碼將成爲可能的話有效:

MyDelegate<object> d1; 

MyDelegate d2; 

MyDelegate d1 = d2; 
+3

委託類型是密封的,你應該清楚地知道。它們不能被繼承。什麼是你[究竟意欲何爲?(https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。通過這種方式表達你的委託聲明,你會獲得什麼?請注意,在某種意義上,代表是單成員接口。因此,如果您真的需要這樣做,那麼很可能將您的關係表達爲「接口」類型,而不是「委託類型」更合適。 –

+1

@PeterDuniho我覺得這樣尷尬,但我不知道他們在密封的想法,以檢查他們是否是還沒有進入我的腦海: - ]謝謝你告訴。您可以將此作爲答案提交,如果可以,我會接受。我用一個我想要實現的例子來擴展這個問題。 – Ivan

回答

1

對不起,我可能已經在說你守太苛刻ld知道委託類型是密封的。在規範中很明顯,但我看了一下MSDN語言文檔的最新版本,但似乎沒有提到這一點。好吧,無論如何&hellip;他們是密封的。你不能創建一個繼承委託類型的新類,你當然不能使用delegate關鍵字來聲明繼承另一個委託類型(關鍵字具有非常特殊的語法一個新的委託類型,甚至不允許一個繼承語法)。

它仍然不是真的我清楚你想要做什麼。但是,從某種意義上講,委託類型只是一個只有一個成員的接口。當然,這更靈活,因爲實現不是單一類型,而是可以是任何類型的任何方法。但從概念上講,兩者非常相似。

從這個意義上說,您可以使用interface而不是delegate表示您的代碼意圖。例如:

interface IDelegate<T> 
{ 
    void M(T arg); 
} 

interface IDelegateObject : IDelegate<object> { } 

當然,問題在於現在您需要某種類型來實現接口。任何給定的類型只能實現任何給定的接口,所以你失去了委託類型通常會給你的很大的靈活性。

但是,你可以做這樣的事情:

IDelegate<object> d1; 
IDelegateObject d2; 

d1 = d2; 

也就是說,因爲IDelegateObject繼承IDelegate<object>,因而「是」 IDelegate<object>,那麼你可以分配IDelegateObject類型的值,即d2 ,到IDelegate<object>類型的變量,即d1

+1

通過接口,您可以使用差異 - 因此,如果根據您的需要/選項使用「IDelegate 」或「IDelegate 」,則可以完成更多的分配任務。 –