引用类型强制转换
多態表現在兩個方面
1.一個父類型的引用在指向不同的對象時會有不同的實現;
如:IUnionPay atm;
atm = new ATMABC(); ?atm = new ATMCBC();
總結,運行時,方法執行看對象!
2.一個子類型對象,“向上造型”成不同的父類型時,可以使用的功能不一樣
“向上造型”指子類類型的變量,可以自動“向上”轉化為父類型的變量。
ATMCBC cbc = new ATMCBC();
IUnionPay atm = cbc;//變量cbc向上造型為父類型IUnionPay類型
再比如:因為ATMCBC類實現了IPolice接口,所以
IPoloce pol = cbc;//編譯正確,變量cbc同樣可以向上造型為IPolice類型
這里父類型可以是抽象類,也可以是接口(父類型的變量僅能使用子類型重寫父類的方法)
優點:動態調度,不同的對象可以調用不同的方法
缺點:父類型變量只能調用子類中重寫父類的方法
缺點解決:強制轉換父類型變量轉化為子類型變量(或者父類型的變量不能自動轉換為子類型的變量),這樣父類型變量可以調用更多方法
例如:
1. IPolice pol = new ATMCBC();//父類型變量只能使用takPic方法
ATMCBC c = pol;//編譯錯誤:父類型轉換為子類型需要強制轉換!
ATMCBC c = (ATMCBC)pol;
//編譯正確。因為pol變量所指向的實際對象類型為ATMCBC,目標類型也是ATMCBC;
2. ?ATMCBC?c?= (ATMCBC)pol;
IUnionPay p =(IUnionPay)pol;
//因為實際對象時ATMCBC類型,目標類型時IUnionPay類型。實際對象類型是目標類型的子類型。
3.ATMABC aa = (ATMCBC)pol;
//編譯正確,但運行錯誤;因為pol指向的對象類型,不是ATMABC的子類型
強轉看對象!目標類型必須是對象類型本身或者對象的父類型
總結
- 上一篇: 这可能是Python里最强的绘制地图神器
- 下一篇: MatLab函数:pol2cart()