C 與C 對比學習 物件導向,介面,抽象類

2021-09-30 15:25:41 字數 2830 閱讀 9875

物件導向程式設計語言中最重要的概念無疑是class,所謂一切皆物件.(不過要是老天天呆電腦前寫**研究物件導向語言,那要真找物件找老婆就很成問題.可不是滿世界的美女們都皆是你物件.)類是乙個抽象的概念,和我們現實生活中對事物分類起名差不多,比如美女,帥哥,二奶,官二代這樣的名詞就是乙個類,代表具有相似屬性的一類事物.每乙個類例項化之後就是物件.就像美女這一類人中具體的某個美女才是乙個物件,有可能成為你的物件.現實世界中的所有事情事件都能分成一類一類的,乙個叫維根斯坦的老兄呆監獄裡的時候閒得蛋痛就琢磨著從語言學邏輯學的角度來把整個世界五馬分屍,分為一些啥原子事件.然後這些原子事件通過些邏輯組合能形成乙個複雜的現實世界.他的那本書叫《邏輯哲學論》.據傳聞物件導向的思想就是從他的思想演化來的,不過傳說就跟緋聞一樣,真真假假誰知道啊.很多聰明人想問題時可能會得出些相同結論.有人說萊布尼茲發明二進位制也是受易經的啟發,那八卦圖上有著二進位制的原理

從語法的層面講抽象類(abstract class)和介面(inte***ce)區別不大,可以都看成一種特殊的類.只有從設計的層面考慮才有比較重要的意義,那只有做構架師時才去考慮的事了啊,像我們這樣命苦的碼農還是老實的把語法搞懂,把**敲好.抽象類是完全體現類的概念,對某一類具有相同屬性事物的抽象,只不過它是為了做父類,讓子類繼承的.所以很多函式可以只宣告在那裡,不用去定義實現.而介面不是完全體現類的概念,不是對相同的屬性的抽象,還是定義一系列行為準則.所謂介面顧名思義,我們平時裝燈泡啊,電腦上的usb介面,耳塞介面都是有個統一標準的,你的u盤可以插任何電腦上,如果沒有個這樣的統一的介面標準,那沒法插的啊。介面一般在不同的project之間呼叫時用的較多點,把project裡面其他東西都封裝了,你知道介面就行,特別是c++如果要呼叫c#的com元件的話,com元件要強制要用到介面的.所以用的時候你只管呼叫介面中的函式就行,怎麼實現就不用管了.當然介面是不能例項化的,但你可以通過介面指標指向實現了介面的類,在c#中沒有指標的話就可以這樣infaceclass instance = new classcompleteinte***ce(); 這其實和指標蠻像的.c++中每個class都可以有個頭檔案,標頭檔案其實蠻像介面的.也是體現了介面那種思想.不過在c#中沒有標頭檔案的概念了.不過c#中有個partial class的概念,這樣乙個class的**可以分布在多個檔案中,如果你想模擬出c++的標頭檔案,可以用它做到.

除了在不同的project中比較有用,介面在同乙個project中也同樣有用了.特別在c#中由於class不能像c++中一樣實現多重繼承,只能單繼承,但介面可以多繼承.所以如果專案要擴充些功能,要在某個類中新新增些功能.可以先新增乙個介面,宣告需要實現些啥功能,然後在原來某個class中繼承這個介面,並實現它.站在設計者的角度,乙個是要隱藏實現細節,就是所謂的封裝.另乙個就是便於擴充套件,新增新內容進去.

設計者們在設計時先是資料建模,把乙個系統抽象出來然後分割成一小塊一小塊的.每一小塊就對應乙個class.當然他們設計時可不去管具體的**實現細節,所以設計出來的class都基本上是些函式的宣告.也就是乙個個的抽象類,介面(這個不一定是**中的概念,到最後轉化成**時可能會是抽象函式,介面,但也可能是一般的類)

public delegate void iampointer(string input); //這個自然不是必需的,只是為了下面使用事件而在此定義的.

inte***ce weiwenhp

//屬性

void doit(string cmd); //函式

int this[int index] //索引器

event iampointer myevent; //事件

}1.介面不能例項化,但假如有個類arwen繼承了weiwenhp.你可以這樣用weiwenhp instance = new arwen(); //這樣不會出錯的.weiwenhp instance = new weiwenhp();自然不行

2.定義介面時可用訪問修飾符public 或internal.預設是internal(只能程式集內訪問).但介面裡面的函式等宣告不能用任何訪問修飾符.

3.介面中只能有函式,屬性,索引器,事件的宣告.後三者都是c#中新新增的特性.屬性和索引器可以簡單的理解為一種特殊的函式,封裝class內部的字段,對外提示乙個介面.屬性一般封裝基本型別,索引器一般封裝陣列型別.事件可以簡單理解為對**的封裝,而**有點類似函式指標.另外介面中是不能有靜態函式和虛函式的宣告

和一般類基本上一樣,只不過定義時加個修飾符abstract.比如 abstract class myclass

和一般類只有幾個細小的區別

1..首先自然是不能例項化,但可以像介面一樣那樣例項化.另外類中可以用到抽象函式(但也可以沒有抽象函式),比如public abstract void fun(); //一般的類是不能用抽象函式的

2.抽象類內部的函式等訪問修飾符不能為private,因為它的設計目的就是讓別人來繼承它的.由於類內部不加修飾符時預設都是private,所以抽抽象類中所有函式,等都要加修飾符.當然字段除外,它可以是private.

3.除了上面的區別外,抽象類完全跟一般類一樣.其實你拿個一般的類過來,直接加個abstract 就變成個抽象類.一點問題都不會有.

c++介面

據說標準c++中是沒有inte***ce的,平時用到的inte***ce實際上是通過一些巨集來實現的,背後的原理還是虛純基類.這個還有待研究

c++的抽象類跟c#的抽象類區別還是比較大的.c#中抽象類的標誌就是class前面有個abstract就行了.然後class內部就跟一般類差不多.

而c++抽象類不會用到abstract關鍵字,它的標誌是在class內部至少要有乙個純虛函式(這是c++獨有的概念),c#中沒有.

舉個例子

class arwen

int age;

public:

virtual void fun(int num) = 0; //這就是純虛函式了.

五 抽象介面與依賴反轉(C物件導向開發)

內容參考於 抽象接 術和元件開發規範及其思想 基於多型可以實現 與硬體無關 的應用程式。在 c 程式設計中,多型的核心解決方法是充分利用 函式指標 抽象介面就是只包含函式指標的類,它們非常抽象,不包含任何具體的實現,僅定義了函式的呼叫規則。應用不在依賴具體的實現,根據介面去編寫應用。實際上之前的綜合...

C 物件導向 C 資料抽象

資料抽象是指,只向外界提供關鍵資訊,並隱藏其後台的實現細節,即只表現必要的資訊而不呈現細節。資料抽象是一種依賴於介面和實現分離的程式設計 設計 技術。c c 的學習裙 七一二 二八四 七零五 無論你是小白還是高階者,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多乾貨和技術資料分...

C 介面與抽象

一 抽象類 抽象類是特殊的類,只是不能被例項化 除此以外,具有類的其他特性 重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能宣告於抽象類中,且不包含任何實現,派生類必須覆蓋它們。另外,抽象類可以派生自乙個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。...