查看完整版本: 轉型問題
頁: [1]

1006910211 發表於 2016-7-23 03:23 PM

轉型問題


我遇到一些轉型的疑問,請各位高手協助
假設Director extends Manager
      Manager extends Employee

那麼我先建立三個物件
Employee emp = new Employee();
Manager man = new Manager();
Director dir = new Director();


再將dir物件指派給emp變數(多型)
emp = dir;

變數emp現在是參考dir物件,所以我可以將emp指派給man物件,
我的疑問是子物件指派父型別變數符合多型目的,但為何還須轉型(如下)才可以編譯過關,底下兩個程式都可以編譯過關,請問哪個是正確的,這樣轉型的目的為何,凡請各位協助釐清觀念,非常感謝
man = (Manager)emp;
man = (Director)emp;


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

22616846 發表於 2016-7-24 03:04 PM

本帖最後由 22616846 於 2016-7-24 03:05 PM 編輯

其實在多型,物件有分真實的型態,和虛假的型態,真實的型態 是程式執行時所跑的型態,虛假的型態是編譯時期程式的型態,例如Employee emp = new Director (); 。Employee  就是虛假的型態,Director 就是真實的型態。
在你的問題中,emp 虛假的型態是Employee ,真實的型態是Director ,所以在編譯時期,當然要強制轉型成子類別才能通過。
一般程式是不會直接寫man = (Manager)emp;這種語法,都會先加判斷if(emp instanceof Manager){ man =(Manager)emp;}...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
頁: [1]