PTT
Submit
Submit
選擇語言
正體中文
简体中文
PTT
C_Sharp
[問題] 請教 向上/向下轉型 的問題
作者:
berice152233
(WASHI買的zenfone2)
2019-11-21 17:31:10
各位學長好
我在看深入淺出C#的時候有一個疑問
第一版(買的時候沒注意...)
P267、P268的部分有談到向上、向下轉型
就我個人的理解
例如父類有A方法,子類有B、C方法
向上轉型:
將子類別的物件內容等同於父類
父類名 物件1 = new 子類名();
原本子類物件可以使用A、B、C方法
向上轉型後的物件1就只能使用父類的A方法
向下轉型:
將向上轉型的物件,用一個新物件再轉回來
上面的子類物件現在只能用A方法
那我再用一個物件讓他轉回來(???)
子類名 物件2 = 物件1 as 子類名;
這樣物件2就能使用A、B、C三種方法
在這裡我就有問題了
為什麼要這樣向上向下轉型?
如果直接new一個新的父類物件
效果不就等同向上轉型後的物件嗎?
如果直接new一個新的子類物件
效果不就等同向下轉型後的物件嗎?
有什麼情況非得要用向上、向下轉型不可呢?
請各位學長不吝指教,感謝
作者:
s4300026
(s4300026)
2019-11-21 18:21:00
不,你搞錯了,真相只有一個,就是實體只有一個。其他都是標籤紙,is是判斷能不能把標籤貼在實體上,as是回傳一個已經貼在上面,並且標籤名稱是你指定的。實體就是你new出來的東西,new回傳的東西也是標籤紙。然後第三句話,標籤名稱要改成標籤型態。=================那為什麼要向上轉型,因為你很懶,當你有一堆子類別時,你不想要宣告一堆變數去記住實體在哪,父類別都可接,還可以直接用爸爸的方法,當你真的要用兒子的方法時,再向下轉型就好了。
作者:
berice152233
(WASHI買的zenfone2)
2019-11-21 22:45:00
感謝,有點複雜,我會努力理解的
作者:
samchung
(不是咖啡店小開XD)
2019-11-21 23:18:00
推s大的標籤紙形容 XD小弟想到物件集合(或物件陣列)的應用情況請參考範例
https://dotnetfiddle.net/KNvWy4
關鍵在泛型集合使用父類別的型別才可在集合內放入相同血緣關係的父、子物件
作者:
Litfal
(Litfal)
2019-11-22 09:15:00
標籤紙讚讚 至於為什麼要轉, 得從OOAD最基本的收納與使用來想。你有一些鉛筆和一個鉛筆盒,鉛筆盒只能放鉛筆,那你拿到原子筆時就會有點麻煩。你有兩個選擇:1.做一個原子筆盒拿來放原子筆。2.把鉛筆和原子筆都視為筆,並把鉛筆和改成筆盒,可以放所有種類的筆。 盒想當然是2.比較好,你也不想包包裡塞滿各種類的筆盒吧?而且未來有其他種類的筆,也是直接塞進筆盒裡就好。這是收納部分。而使用上,管他什麼筆,都可以用來寫所以會在父項 筆 的類別裡面,定義 寫() 的方法你從筆盒裡面拿出的筆,管它是什麼筆,拿出來就可以寫()至於各種筆自己獨特的功能,例如多色筆可以換色,自動筆可以換筆芯,鉛筆可以被削,這些功能就由子類別個別去實作向下轉型的需求就由此而來。例如你有台削鉛筆機,它只吃鉛筆。原本隨便從鉛筆盒拿出一支筆都能削,現在,你必須檢查(或是由削鉛筆機檢查)你從筆盒拿出的筆,它是不是鉛筆,確定是鉛筆後才能把它塞給削鉛筆機來削
作者:
s4300026
(s4300026)
2019-11-22 10:55:00
實際上標籤紙的概念是出於 深入淺出 C#,也就是你正在讀的那本,那本書上的圓圈就是實體,方框內的名稱就是標籤。 XD實際上,在實務上只有強調轉型,我們並不在乎是 “向上還是向下轉型”,在後面的章節,interface的關鍵字,你就會體會到了。
作者:
nickboy
(殘心)
2019-12-06 17:07:00
我基本上都用向下居多,向上是懶惰的時候才會用
繼續閱讀
[問題] 請教 無瑕的程式碼 C# 內容的問題
berice152233
[問題]Scrollbar 寬度調整
iloveduck
[問題] Winform 控制項會失效
nietz
[問題] Queue 接收 byte[] 記憶體持續上升
abc95007
[問題] View 使用 tuple傳值到controller
KAINTS
[問題] DataTable的圖片string轉圖檔
vanchy
sqlbulkcopy vs seq
sicao
[問題] 如何在現有專案中再加入新的model (MVC5)
KAINTS
[問題] listbox 改變使用者自行改變字串問題?
ChenRobert
.net技術棧有哪些
tree581
Links
booklink
Contact Us: admin [ a t ] ucptt.com