3 回答

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個(gè)贊
這里的大多數(shù)答案都集中在OOP上,但是封裝開始的時(shí)間要早得多:
每個(gè)函數(shù)都是封裝;在偽碼中:
point?x?=?{?1,?4?} point?y?=?{?23,?42?} numeric?d?=?distance(x,?y)
這里,
distance
封裝平面中兩點(diǎn)之間(歐幾里德)距離的計(jì)算:它隱藏實(shí)現(xiàn)細(xì)節(jié)。這是封裝,純而簡(jiǎn)單。抽象化是…的過程泛化*具體實(shí)施,并使其適用于不同類型的數(shù)據(jù),盡管有些相關(guān)。抽象的經(jīng)典例子是C的
qsort
函數(shù)對(duì)數(shù)據(jù)進(jìn)行排序:關(guān)于
qsort
是它不關(guān)心它排序的數(shù)據(jù)-事實(shí)上,它不知道它分類的數(shù)據(jù)。相反,它的輸入類型是一個(gè)無類型指針(void*
),這只是C的一種說法:“我不在乎數(shù)據(jù)的類型”(這也稱為類型擦除)。重要的一點(diǎn)是qsort
無論數(shù)據(jù)類型如何,始終保持不變。唯一有更改是比較函數(shù),它因數(shù)據(jù)類型而異。qsort
因此,期望用戶將所述比較函數(shù)作為函數(shù)參數(shù)提供。
封裝和抽象是緊密聯(lián)系在一起的,所以您可以指出它們確實(shí)是不可分割的。出于實(shí)際目的,這可能是正確的;盡管如此,這里的封裝并不是抽象的:
class?point?{ ????numeric?x ????numeric?y }
我們封裝了點(diǎn)的坐標(biāo),但是除了邏輯分組之外,我們并沒有將它們抽象出去。
這里有一個(gè)抽象的例子,它不是封裝的:
T?pi<T>?=?3.1415926535
這是一個(gè)泛型變量?pi
對(duì)于給定的值(π),聲明并不關(guān)心變量的確切類型。誠然,我很難在實(shí)際代碼中找到這樣的東西:抽象幾乎總是使用封裝。然而,上述是嗎?實(shí)際上存在于C+(14)中,可變模板(=變量的通用模板);具有稍微復(fù)雜的語法,例如:
template?<typename?T>?constexpr?T?pi?=?T{3.1415926535};

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊
封裝隱藏實(shí)現(xiàn)細(xì)節(jié),這些實(shí)現(xiàn)細(xì)節(jié)可能用于一般行為,也可能不用于特定行為。
抽象化是提供一個(gè)泛化(例如,對(duì)一組行為)。
- 3 回答
- 0 關(guān)注
- 821 瀏覽
添加回答
舉報(bào)