為什麼會出現抽象類,抽象類的作用是什麼呢?舉個例子那樣最好了。
這個問題沒辦法簡單回答。
首先要搞清楚的是繼承有什麼用,函數重寫有什麼用。繼承和函數重寫實現的是代碼的復用(一次編寫,重復使用)
從最簡單的說起。你編寫了一個函數,你希望下次還要用,你怎麼做?直接調用就是了,是不是?
那麼我問你,如果你下次要用,但是代碼不完全一樣,需要修改下,怎麼用?你有兩個辦法:(1)復制一份代碼,再建一個函數。然後在裡面改。(2)直接在原來的函數中改,為了保證原來函數的調用的正確,你需要加一個參數,比如type,然後在需要修改的地方增加一個if判斷,如果是type=1,走原來的邏輯,否則走修改的邏輯。
你能說出這兩個辦法的問題麼?顯然方法1,增加了很多重復的代碼不說,而且如果發現這個函數別的地方有bug,需要修改,你同時要修改兩份代碼,很容易忘記。
方法2,你修改了函數的參數,那麼所有原先的調用者都要找出來跟著修改。而且,這個方法的問題還在於,你需要直接修改人家寫好的函數,如果是一個團隊開發,一個函數改來改去,你的代碼被別人修改了你都不知道,你下次調用,發現多了一個參數,你問誰去?
那麼怎麼解決?用繼承和函數重寫。定義一個類,把函數寫好,其中函數中可能需要擴展和變化的地方,提取出來放在另一個函數中,這個函數作為虛函數。
需要修改函數怎麼辦?不需要直接在代碼上修改,只要派生一個這個類型,重寫那個虛方法,就可以實現代碼的替換了。
以上我說的很簡略,你自己需要看書理解,並且寫幾個程序體會下。
知道了繼承和重寫是干嘛的,現在回答你的問題,抽象類是干嘛的。有時候我們需要編寫一些預制的代碼,但是這些代碼中的某一部分我們沒有辦法給一個具體的實現。
打一個比方,我們設計一個抽象的流的代碼,給這個流讀取、寫入、序列化、轉換為字符串、轉接到另一個流等操作。顯然,其它方法我們可以寫出來,但是讀取寫入我們沒法寫。不同的流,io是不同的,對不對?
此時我們怎麼做?只能用抽象類了。