每個對象本質上就是內存的一塊空間,只是不同的對象占用不同的空間而已,聲明變量就是告知我要這么大范圍的一塊空間進行訪問,當真正new Object()
實例化的時候才真實給這個變量分配了一塊空間,一般情況下都是你要多大的就實例化多大的不涉及類型轉換,而如果你要的和分配的范圍不一樣就要涉及到類型轉換了
//*****聲明不需要類型轉換的對象(聲明的和分配的同樣大小)***** //ParentClass PayInfo pay = new PayInfo(); pay.MerchantId = "pay"; //ChildClass PayMsgContent msg = new PayMsgContent(); msg.TradeSerialNo = "msg";
//*****聲明需要類型轉換的對象(聲明的和分配的不同大小)***** /* * 【比如父類占用60的空間,子類占用100的空間】 * 子類轉父類:父類的變量可操作的范圍小於子類對象分配的范圍,編譯器就會暫時把變量類型可以操作的部分(內存空間)給它操作, * 而不可操作的部分(內存空間)並不會被丟棄而是暫不可用的狀態,而這種操作是安全的所以編譯器可以通過 */ PayInfo pay1 = new PayMsgContent();
/* * 父類轉子類:子類的變量可操作的范圍大於父類對象分配的范圍,編譯器就會告訴你“親~需要類型轉換后才可以呦~”, * 所以我們加上一個顯式類型轉換,但真正運行時還是會報錯,告訴你“類型無法轉換”因為實際實例化的是父類, * 它始終無法覆蓋子類的范圍所以無法轉換,那既然無法轉換,為什么又告訴我轉換就可以呢?實際它真實的想法是下面的例子 */ PayMsgContent msg1 = (PayMsgContent)new PayInfo();
//*****可以進行父類轉子類的方式***** //當聲明父類變量而實例化是一個子類對象時,會直接分配一塊子類對象范圍的內存空間屏蔽掉其中屬於子類的那部分來給父類變量使用,所以實際上它還是一個子類對象,只是使用父類引用來操作而已 PayInfo pay2 = new PayMsgContent(); //此時進行子類轉父類的操作,會將這個對象中暫不可用的子類屬性開啟變成完整的子類對象,來賦給這個子類變量使用 PayMsgContent msg2 = (PayMsgContent)pay2;
如果一定有業務操作需要父類轉換子類的需求,可以使用如下方式實現
//*****如果一定有業務操作需要父類轉子類可以用下面方法***** //1、父類創建參數為父類對象的有參構造 /* public PayInfo(PayInfo payInfo) { CustomerNo = payInfo.CustomerNo; AccountNo = payInfo.AccountNo; //do something... } */ //2、子類創建參數為父類對象的有參構造並調用父類此有參構造 /* public PayMsgContent(PayInfo payInfo) : base(payInfo) { //do something... } */ //3、這樣在我這個需求里就可以完成自動賦值的操作了