第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

將泛型類轉(zhuǎn)換為其繼承類

將泛型類轉(zhuǎn)換為其繼承類

C#
明月笑刀無情 2021-12-05 16:41:09
我正在重構(gòu)一個(gè)舊庫,其中包含以下類:public class Template  //Old one{    public double Value { get; set; }}現(xiàn)在最好提供更多的靈活性以允許用戶定義Value類型。所以我改成Template了泛型類:public class Template<T>{    public T Value { get; set; }}此更改打破了舊Template類的用法,因此我嘗試添加向后兼容性(允許其他人以舊方式使用我的庫):public class Template: Template<double> { }但它也需要在庫中進(jìn)行大量更改。特別是在使用舊的地方Template,例如:public class AnotherClassInLibrary<T>{    public Template<T> API() {...}}public class AnotherClassInLibrary : AnotherClassInLibrary<double>{    // This class is also defined for the old way of using the library    public Template API()    {         return base.API();         // Error here: Template<double> cannot be implicitly convert to Template.    }}所以問題來了: newTemplate是從 繼承的Template<double>,所以在這里轉(zhuǎn)換不是一個(gè)好的/工作實(shí)踐。有沒有辦法在AnotherClassInLibrary不重寫API()代碼兩次的情況下保持向后兼容?PS 我真的希望 C# 有類似typedefC++ 的東西。但答案是否定的。
查看完整描述

1 回答

?
慕絲7291255

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊

即使你的Template類繼承自Template<double>,它也不一樣??紤]您將更改的定義Template如下:


public class Template : Template<double>

{

    public int AddedMember { get; set; }

}

現(xiàn)在,您嘗試執(zhí)行前面的代碼。您正在嘗試將具有某些屬性的類轉(zhuǎn)換為具有更多屬性的類 - 您將訪問內(nèi)存中不正確的位置!


您始終可以將類轉(zhuǎn)換為其基類,因?yàn)轵?qū)動(dòng)類包含所有基類的成員。因此,不需要顯式轉(zhuǎn)換。但是,當(dāng)您嘗試將基類轉(zhuǎn)換為驅(qū)動(dòng)類時(shí),只有當(dāng)基類變量指向驅(qū)動(dòng)類的實(shí)例時(shí),轉(zhuǎn)換才會(huì)成功,因此,驅(qū)動(dòng)類的所有成員都存在。如果否,InvalidCastException則在運(yùn)行時(shí)拋出遺囑。因此,需要顯式轉(zhuǎn)換(因?yàn)槭褂蔑@式轉(zhuǎn)換的準(zhǔn)則之一是在轉(zhuǎn)換可能失敗時(shí)使用顯式轉(zhuǎn)換)。


因此,如果您將代碼更改為變量 a(類型Template<double>),則轉(zhuǎn)換將成功:


Template<double> a = new Template();

Template b = (Template)a; // No exception will thrown

最后的代碼會(huì)成功,因?yàn)樽兞縜指向的Template(而不是Template<double>)的實(shí)例,所以我們確定(在運(yùn)行時(shí))所有的成員Template都存在并且不會(huì)發(fā)生錯(cuò)誤。


編輯:

你說出你的要求后,我可以幫你。你想要什么?您想啟用“模板”到“模板”的轉(zhuǎn)換 - 這可以通過 [用戶定義的轉(zhuǎn)換](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions -運(yùn)營商/轉(zhuǎn)換運(yùn)營商)。

但是,不允許在驅(qū)動(dòng)類和基類之間進(jìn)行自定義轉(zhuǎn)換。所以,有兩種解決方案:


Template不會(huì)繼承自Template<double>,如下所示:

    public class Template<T>

    {

        public T Value { get; set; }

    }

    

    public class Template

    {

        public double Value { get; set; }

        

        public static explicit operator Template(Template<double> generic) // Or implicit instead of explicit

        {

            return new Template { Value = generic.Value };

        }

    }


    var generic = new Template<double> { Value = 1234.56 };

    var nongeneric = (Template)generic; // Or Template nongeneric = generic; if the conversion defined as implicit

您不會(huì)定義自定義轉(zhuǎn)換,而是定義一個(gè)常規(guī)方法(我定義了一個(gè)構(gòu)造函數(shù)):

    public class Template<T>

    {

        public T Value { get; set; }

    }

    

    public class Template : Template<double>

    {

        public Template(Template<double> generic)

        {

            this.Value = generic.Value;

        }

    }

    

    var generic = new Template<double> { Value = 1234.56 };

    var nongeneric = new Template(generic);


查看完整回答
反對(duì) 回復(fù) 2021-12-05
  • 1 回答
  • 0 關(guān)注
  • 244 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)