2 回答

TA貢獻1845條經(jīng)驗 獲得超8個贊
首先要知道類存在的理由,為何要面向?qū)ο?/a>。
C中的結(jié)構(gòu)體就是定義一種數(shù)據(jù)格式,可以存儲若干數(shù)據(jù)元素,并且它們的內(nèi)存是連續(xù)的。
結(jié)構(gòu)體的作用是封裝一組有關(guān)聯(lián)的屬性,它們共同維護某種概念實體的狀態(tài)。
在早期經(jīng)典純C工程當(dāng)中,有經(jīng)驗的開發(fā)者早就開始利用結(jié)構(gòu)體與函數(shù)指針實現(xiàn)簡單的面向?qū)ο?/a>。
但是用結(jié)構(gòu)體+函數(shù)指針使用不方便不靈活,所以C++最大的使命,面向?qū)ο?/a>就誕生了。
要注意的是C++與C的區(qū)別除了類之外,還有函數(shù)多態(tài)的特性、命名空間、STL等等特性。
類相比于結(jié)構(gòu)體+函數(shù)指針最大的優(yōu)勢就是兩個字:繼承
撤了一大堆廢話,針對LZ的問題可以歸結(jié)為,在沒有屬性的時候,只有函數(shù),使用類好不好,或者說何時可以如此使用。
如果LZ學(xué)習(xí)過設(shè)計模式,那么這個問題就頗為清晰,類的存在是為了更靈活地描述某種概念實體以及對它的操作。
一個只有函數(shù)而沒有屬性的類,其描述的實體可以認為是一種抽象的動作實體。
用通俗的話來講,一個繼承Animal的Cat類描述一個貓,貓有屬性(形態(tài),叫聲,年齡等),也有動作(吃喝拉撒睡),這就是最經(jīng)典LZ也熟知的一種類。
而抽象的動作類,就有比如一個繼承File的DiskFile或者FtpFile等,它主要描述的是一組動作(讀與寫),它也許有狀態(tài)(屬性),也許沒有。
這種抽象的動作類為何而存在?經(jīng)典的策略設(shè)計模式就會大量地使用這種寫法。
比如你要做視頻處理軟件,視頻需要解碼與加碼如果只是用純函數(shù)的化你的代碼就會如下丑陋:
1234567891011 | if (0 == strcmp (fileType, AVI)) { decode_AVI(file); } else if (0 == strcmp (fileType, MP4)) { decode_MP4(file); } ..... if (0 == strcmp (fileType, AVI)) { encode_AVI(file); } else if (0 == strcmp (fileType, MP4)) { encode_MP4(file); } |
但是如果你有一個類AVType,只有兩個函數(shù):encode、decode,然后有AVIType、MP4Type繼承它,那么你的代碼大致就是:
1234 | AVType* type = new AVIType(); // or MP4Type type->decode(file); .... type->encode(file); |
當(dāng)你的同類方法多起來(如rmvb、wmv、flv解碼器等等),你就會發(fā)現(xiàn)后者有多優(yōu)秀。
最后總結(jié)對LZ的問題的回答就是:
如果沒有繼承也不會存在潛在繼承的可能,也就是說用不到C++的多態(tài)特新,那么沒有屬性的類就沒有存在的必要。
- 2 回答
- 0 關(guān)注
- 915 瀏覽
添加回答
舉報