亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C#支持返回類型協方差嗎?

C#支持返回類型協方差嗎?

千萬里不及你 2019-06-20 15:29:42
C#支持返回類型協方差嗎?我正在使用.NET框架,我非常希望能夠制作一個自定義類型的頁面,我的所有網站都使用它。當我試圖從控件訪問頁面時,問題就出現了。我希望能夠返回特定類型的頁面,而不是默認頁面。有什么辦法嗎?public class MyPage : Page{     // My own logic}public class MyControl : Control{     public MyPage Page { get; set; }}
查看完整描述

3 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

聽起來你想要的是返回類型的協方差。C#不支持返回類型協方差。

返回類型協方差是覆蓋一個基類方法的地方,該方法返回一個不太特定的類型,而返回一個更特定的類型:

abstract class Enclosure{
    public abstract Animal Contents();}class Aquarium : Enclosure{
    public override Fish Contents() { ... }}

這是安全的,因為消費者的內容通過封閉期待動物,水族館承諾不僅滿足這一要求,而且,作出更嚴格的承諾:動物永遠是一條魚。

這種協方差在C#中是不支持的,也不太可能被支持。CLR不支持它。(C+和CLR上的C+/CLI實現都支持它;它是通過生成我下面建議的那種神奇的助手方法來實現的。)

(有些語言也支持形式參數類型逆變-您可以用獲取動物的方法覆蓋接受魚的方法。同樣,契約已經完成;基類要求處理任何魚,派生類承諾不僅處理魚,而且處理任何動物。類似地,C#和CLR不支持形式參數類型反方差。)

解決此限制的方法是執行以下操作:

abstract class Enclosure{
    protected abstract Animal GetContents();
    public Animal Contents() { return this.GetContents(); }}class Aquarium : Enclosure{
    protected override Animal GetContents() { return this.Contents(); }
    public new Fish Contents() { ... }}

現在,您既可以使用重寫虛擬方法的功能,也可以在使用編譯時類型水族館時獲得更強的輸入功能。


查看完整回答
反對 回復 2019-06-20
?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

將其放置在MyControl對象中將有效:

 public new MyPage Page {get return (MyPage)Page; set;}'

您不能覆蓋該屬性,因為它返回一個不同的類型.但你可以重新定義它。

在這個例子中不需要協方差,因為它比較簡單。您所做的就是繼承基本對象Page從…MyPage..任何Control你想要回來MyPage而不是Page需要重新定義Page的屬性Control


查看完整回答
反對 回復 2019-06-20
  • 3 回答
  • 0 關注
  • 464 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號