協議:不允許實例化的類以及必須被重寫的方法

說了方法的重寫,我們再回過頭來看看那個繼承樹:

這個看起來應該還行,我們可以創建大刀的實例,創建手槍的實例……

但是如果我要這樣寫呢?

那麼問題來了:挖掘機……

不,我們的問題是“武器”到底是個什麼東西?

我們說“動物”,人是動物,鳥是動物,狗、貓都是動物,那有沒有個動物是動物呢?

答案是没[……]

點擊跳轉以繼續閱讀

自定義:覆蓋!

說了那麼多次的重寫,這次我們就來認真的對待一下方法的重寫。

合約

我們說了,繼承就相當於是簽訂合約,我們繼承出來的子類一定要遵守這個合約,那麼就算你想要做一些合約裡沒有的事情,也要遵守合約的規範,所以,你重寫方法,也一定要符合方法的類型。

我們講過方法的類型,它以 ()->() 這樣來表示。所以,重寫的方法也一定要遵守這個類型即接收參數返回參數類型要相同……名字要相同還需要我說嗎?[……]

點擊跳轉以繼續閱讀

多肽?多態!

上一節課我們說完了繼承,那這節課我們就繼續深入,來看看繼承樹的大招是什麼。

可能我和你說起多態這個發音,你最先想到的應該是高中生物裡講的“多肽”;好吧,這兩者之間唯一相同的可能就是發音了。

繼承的意義

我們說繼承實現的意義非凡,它大大降低了我們代碼中的冗餘行數,降低了代碼的維護難度……

其實,我沒有提到繼承的另一個意義——合約。

上一節課我們做了演示,繼承代表了子類獲得了父類[……]

點擊跳轉以繼續閱讀

到底怎麼辦:“是一個”與“有一個”

上節課我們具體地講述了繼承的機制,並且也設計了一個繼承樹,那麼問題來了:我不是要問挖掘機技術哪家強?我是要問如何來確定一個類是另一個類的子類呢?我們又如何設計一個類而不是某個類中的屬性呢?

“是一個”與“有一個”

這裡我們就要用這麼一個方法來檢驗它們二者之間的關係了:

我們說,手槍是槍械——OK,沒有問題,那麼手槍這個類就是槍械的子類。

還有長劍是一把劍,是一個冷兵器——沒問題,那這樣[……]

點擊跳轉以繼續閱讀

再次回顧:繼承

我們這次一起來回顧一下之前幾節課裡提到的繼承,我們曾在初見OPEN 裡用了一個開發手機(系統)的栗子來描述繼承這個東西,相信大家還有印象。

繼承

那麼這節課我們就深入的來了解了解繼承這個概念。

這個其實也不難理解,你看,當你的父輩去世,那他們的財富就會由你繼承——好吧,這不是一件很值得開心的事情,但這畢竟是事實。[……]

點擊跳轉以繼續閱讀

不是你想的那樣:一個攻擊網站的程式

這節課我們來試試開發一個簡單的命令行小遊戲,來完整的體驗一次所謂的“開發過程”。

遊戲設定是這樣的:

這是一種棋盤類游戲,我們來猜測敵人戰艦的位置,只要命中數發就可以擊沉它們。

我們給這些戰艦貼點標籤……比如各種網站吧?所以,這就成了一個攻擊網站的程序……捂臉。

遊戲目標

我們要玩家以最少的次數攻擊網站,把它擊垮。然後我們根據玩家的猜測次數來進行評分。

大致設計

我們畫一個7*7[……]

點擊跳轉以繼續閱讀

計算屬性與封裝

我們在上課之前,一起來回顧一下以前曾提過的“SoC”的概念,我們說這個叫做“Separation of Concerns”,我把它翻譯為責任分離——即不同的部分專注於自己的那一部分。或者說一個對象完成一個目標。

這樣做的目標既讓代碼更加模塊化易於維護,也讓系統運行效率更高。所以說,我們要讓對象之間的通信變得更加規範才行。

數據隱藏

你去看看你在寫代碼時候用到的那些框架,哪個給你直接展示了[……]

點擊跳轉以繼續閱讀

儲存器的值與引用

聲明一個變量

我們使用 var 來聲明一個變量,就好像從櫃子裡拿出了一個試管放在了實驗台上;

我們給變量規定了一個類型,就好像在試管上貼上了標籤;

那麼放入的試劑就必須是標籤上標記了的——否則可能導致中毒或者爆炸。

同樣的,如果我們試圖給一個儲存器放入一個錯誤的數據類型,那麼編譯器就會報錯——沒錯總有辦法能夠騙過編譯器——反正我不會教你這個方法,那樣就會導致程序崩潰啦。[……]

點擊跳轉以繼續閱讀

猜數字遊戲:類的對象的區別

上一節課我們第一次領略了 OOP 的風采,於模棱兩可的類和對象究竟是什麼東西呢?這節課我們用一個簡單的小栗子來向你介紹。

嘗試解釋

我們說類和對象的關係是設計圖和產品的關係,就拿我們的房子來說,一棟樓肯定會有對應的設計圖,但設計圖絕不會只能對應一棟樓,至少一個小區肯定會用一套設計圖不是嗎?我們的“類”就是這個“設計圖”。我們用這個設計圖設計了對象的屬性、功能等等的一系列內容,然後通過實例化來產[……]

點擊跳轉以繼續閱讀