亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

面向對象接口的作用

面向對象接口的作用

牛魔王的故事 2019-04-19 16:30:02
開閉原則。比如說有一個打印機的接口Printer,三個不同的打印機類HP、Epson、Canon實現了打印機接口的打印方法print(),在Output類中有類型為Printer的變量p。不管系統與那種類型的打印機相連,輸出時都調用p.print()方法。而p的具體類型在運行時由系統確定。我只想問怎么理解“p的具體類型在運行時由系統確定”這句話。系統運行了是怎么確定p的具體類型的?希望各位大師指點一下,舉個例子或是提供關鍵點的代碼更好。十分感謝!
查看完整描述

2 回答

?
慕森王

TA貢獻1777條經驗 獲得超3個贊

先占個坑,明天有空過來談談對這個問題的看法。
我來了!撒花~撒花~
不知道我是否理解對了樓主的問題,暫時就我所理解的來說說自己的看法,重在交流嘛~~
為了節省時間和篇幅,下文用OO來代替“面向對象”,請自行在大腦中運行replace()。
首先,開閉原則是OO編程思想中的一個重要原則,既然是OO領域的,自然大前提是針對OO語言下的編碼實踐。同樣,OO語言為我們提供了3大基本特性:抽象、封裝、多態。這是所有OO語言所共通的,如果某個語言沒有提供這3大特性就聲稱自己是OO語言,毫無疑問會被人一巴掌糊一臉翔!
能夠在運行時動態確定對象的類型是一種語言實現多態的前提。同樣,如果一種OO語言無法在運行時確定對象的類型就說自己實現了多態,毫無疑問會被人一巴掌糊一臉翔!
一種OO語言如何實現多態,根據語言的不同方式也不同。但總體來說,必然需要定義某種數據結構,其中記錄著每個運行時對象的相關信息(對象的類型只是其中之一)。每個對象在創建時都會同時生成該結構的實例并且用對象的相關信息填充其中的字段。這樣一來,只需查詢該結構就可以獲得對象信息了。這是語言實現層面的東西,與我們程序員無關,我們只需要知道OO語言提供了這種功能就好。
下面再來談談打印機和print()的問題。我想Output類必然具有以下結構:
Printerprinter=a_printer_instance;
voidoutput(content){
printer.print(content);
}
其中,實際的打印機對象a_printer_instance是在運行時創建的,雖然創建方式可能不同(直接創建、通過工廠、反射、外部注入等等),但可以肯定的是,Output對象所拿到的是一個實實在在的打印機對象,是3種打印機類型之一。而且前面說過,只要存在一個對象,OO語言就能夠獲得它的運行時類型。所以等到執行output()方法中的打印語句時,必然可以找到正確的print()方法實現,進而正確打印出內容來。
僅就多態這一點來說,實現起來并不復雜。用C也可以很容易地實現(使用函數指針)。OO比面向過程更先進的地方體現在它同時實現了抽象、封裝、多態三種特性,從而簡化了軟件開發過程。
不知不覺寫了一大段,到此住筆吧~共勉~
                            
查看完整回答
反對 回復 2019-04-19
?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

我估計你理解歪了
p的具體類型在運行時由系統確定
不是說系統運行起來后,里面有個啥機制幫你確定p的具體類型
實際上就是寫代碼調用Output()方法時自己決定,調用這個方法時,傳遞的p參數對象,是一個實現了Printer接口的類實例就行了
                            
查看完整回答
反對 回復 2019-04-19
  • 2 回答
  • 0 關注
  • 892 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號