如何理解物件導向(一)

王同學呀發表於2018-07-20

先宣告一下,在下其實是一隻非常非常大隻的菜鳥。秉承菜鳥上路的精神,所以儘量不涉及非常僵硬的概念並且用自以為很生動的大白話來寫博文。如有筆誤之處或者寫的不好的地方,還請大家不吝賜教。
另外,本文在配合一定基礎的情況下服用效果更佳!

程式導向和麵向物件的區別

為了更好的理解什麼是物件導向,物件導向和麵向過程有什麼區別,我舉一個生活中的小例子來對比一下兩者的區別:開車去超市。

程式導向:
程式導向的話可以理解為我們現在要開一輛普通的小汽車,首先踩住剎車>鬆開手剎>踩離合掛擋>點火發動>一頓猛如虎的操作之後到達目的地。

物件導向:
物件導向的話就可以理解為我們的車是無人駕駛汽車,我們告訴車我們要去超市,然後車自己一頓操作把我們帶去了超市。

從上面的小例子中我們可以看出,在物件導向的情況下我們甚至不需要知道超市在哪也不需要知道怎麼開車,我們只需要告訴車我們要去超市即可。此時,我們可以將這輛可以將這個無人駕駛汽車理解成一個物件;而在程式導向的情況下我們不僅需要知道怎麼開車,還需要知道去超市的路怎麼走,然後我們還要自己開車!

程式導向的時候,我們主要的操作都是在開車,我們要在路上控制車速,注意紅燈和路上的標誌。而物件導向的時候,我們唯一的操作就是在告訴車,去超市。這就是區別:物件導向的時候主要突出的就是我們對那個物件的操作,程式導向的時候突出的則是我們在達到目的的過程中的一些列操作。

怎麼物件導向

如何實現物件導向?那我們需要先了解一下。類的話,我們暫時先將其理解設計圖。就如我們之前提到的無人駕駛汽車,類就是這個無人駕駛汽車的設計圖,而帶我們去超市的那臺無人駕駛汽車就是物件。有了設計圖我們就可以創造出事先設計好的物件。

枯燥的說是沒有用的,所以不如我們用程式碼簡單模擬一下當下熱門的《王者榮耀》的實現,首先,我們定義一個類來設計一個小兵。王者榮耀中最重要的存在,嗯,誰不服?

class Soldier{
    public int hp;
    public int attack;

    /*
    為了方便新手理解,所以去掉了this關鍵字和數值的判斷
    */
    public void beBeaten(int attack) {
        hp = hp - attack;
    }
}

好的,通過上面的程式碼我們設計好了一個小兵,這裡將小兵設計成了一個有HP值和攻擊力和一個beBeaten(捱打)方法的小兵,然後現在我們建立一個小兵,然後設定一下小兵的血量和攻擊力。

// 建立一個小兵物件
Soldier soldier = new Soldier();
soldier.hp = 500;
soldier.attack = 40;

OK,我們現在建立了一個小兵,它擁有500的血量和40的攻擊力。嗯,是不是有點上道了?接下來我們試試攻擊一下它:

// 好的,現在假設我們是一個攻擊力200的亞瑟,我們去A一下這個小兵
soldier.beBeaten(200);

現在如果檢視這個小兵的HP的話他就只剩下300的HP了。這就是簡單的一個物件導向的小案例。

那麼問題來了,《王者榮耀》裡不止一種小兵,它有近戰的,遠端的,炮車和超級兵。難道每個型別的小兵我們都要重新設計一次?當然不用,下面我們就來了解一下物件導向的特性之一:繼承。

物件導向 - 繼承

什麼是繼承?先來個繼承的定義,繼承就是子類繼承父類的特徵和行為,使得子類物件(例項)具有父類的例項域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。

這真是十分之枯燥乏味,所以我覺得我們還是一邊繼續完善我們的小模擬,一邊來理解什麼是繼承比較好。現在我們結合一下先前設計好的小兵,我們會繼續沿用上面的程式碼

Class MasterSoldier extends Soldier {
}

上面,我們建立了一個用來設計法師小兵的類,它繼承了我們之前設計的小兵的那一個類,我們可以看到,它並沒有什麼欄位(成員變數)或者是什麼方法,但是實際上,它擁有了Soldier類所有的欄位和方法。

MasterSoldier masterSoldier = new MasterSoldier();
masterSoldier.hp = 400;
masterSoldier.attack = 60;
masterSoldier.beBeaten(200);

嗯,十分生動形象的理解了繼承嘛,現在我們在回頭去看那一句繼承的定義是不是就理解了它的意思?

相關文章