接口與類的關系
類與接口是兩個概念,不能混淆。
接口概念
程序接口是操作系統為用戶提供的兩類接口之一,編程人員在程序中通過程序接口來請求操作系統提供服務。面向過程語言最基本的單元是過程和函數。
接口,通俗的來說就是完成某個操作的一個概念,里面可以定義函數 方法,實現接口后,重寫完成某個操作具體代碼操作。就是將類內部進行分類。對于map對象,我們可以做好幾個接口,這些接口中定義不同功能的方法,函數和屬性,map類實現這些接口,這樣我們可以使用接口定義,實現對象。因此,所謂接口就是一系列相關方法與屬性集合的定義。
接口不局限于是一個關鍵字,而是一組設計思想:
· 把待開發對象的接口理清楚,就決定了你對需求的理解程度和設計方案的方向正確性,其實就是需求分析和概要設計,它也同時決定了測試設計的質量。
· 把對象的內部接口理清楚(劃分模塊,理清它們之間的交互),決定了方案的實現,其實就是詳細設計和編碼的工作。
· 代碼寫亂了,已經難以理解了,這時要使用接口分離,這叫重構。
怎樣才能把接口描述清楚呢?描述接口有兩個重點,稱為2P:一是協議(Protocol),二是原型(Prototype),它們分別描述了交互的方式與內容。協議說的是,調用方和被調用方是怎樣交互的,比如基于HTTP協議,請求參數用urlencoded格式,返回內容用JSON格式;原型描述的是一個請求的內容,調用名稱,參數和返回內容是什么含義,以及類型。
大到軟件工程,小到編寫個去后臺獲取訂單列表的函數,多半的時間都花在確定接口和實現接口上。
接口使用目的:抽象類所擁有的共性,也可以概括為:為了多態。
特點:
1.接口中只能包含方法。(方法、屬性、索引器、事件)
2.接口中的方法不能有任何實現
3.接口中的成員不能有任何訪問修飾符(哪怕是public)
4.接口不能被實例化
5.實現接口的類,必須實現接口的所有成員(這里跟抽象類一樣)
6.類不能多繼承,所以在某些情況下,只能用接口來代替。接口可以多實現(一個類可以繼承多個接口,而只能繼承一個類)
7.接口的主要目的就是為了實現多態
8.當一個類,同時繼承了某個類,并且也實現了某些接口的時候,必須要將繼承的類寫在第一個(如果一個類同時繼承了父類和接口的時候,要把父類寫在最前面)
9.當多個類,都具有某個或某幾個功能時(方法),但是這幾個類型又不屬于相同的系列(這幾個類型沒有共同的父類,就不能用抽象類。),所以這時,為了實現多態就可以考慮把這幾個類型共有的方法提取到一個接口中,讓這幾個類型分別實現該接口
10.當父類實現接口,子類繼承父類。那么 接口就可以引用子類
11.不要在一個接口中寫過多的方法,避免造成接口污染。可編寫多個接口,在每個接口中,分別定義方法
12.實現接口方法的時候,不要有override關鍵字,直接跟平常定義一樣
13.接口方法的顯示實現,如果多個接口里有相同的方法名。那么第一個方法名默認的引用的是排在最前面的接口,如果要使用后面接口的方法,就要顯示實現:接口名。方法名。訪問修飾符是private
什么時候把方法放到父類中 還是接口里:
當一個父類派生出5個子類時,所有子類中只有3個需要一個功能,也就是說不是所有的子類都需要此功能,那么就可以把次功能放到一個接口里,各子類進行單獨的實現。
接口為了更好的約束子類。
類(Class)的定義
實現信息封裝(數據成員和成員函數,)的基礎。類是一種用戶定義類型,也稱類類型。每個類包含數據說明和一組操作數據或傳遞消息的函數。類的實例稱為對象。
類與類,類與接口,接口與接口的關系
a:類與類 *繼承關系? ?
?
? ? ? ?只能單繼承,可以多層繼承
b:類與接口 *實現關系? ?
? ? ? ?類可以單實現,也可以多實現 ,并且還可以在繼承一個類的同時實現多個接口。接口不能被實例化,主要目的就是為了實現多態。一個類只能有一個父類,一個接口可以繼承多個接口 ,接口中的方法都是抽象方法(沒有方法體) 。
c:接口與接口 *繼承關系? ?
?
? ? ? ? 可以單繼承,可以多繼承
[java]
view plain copy
interface interA{
public abstract void printA();
}
interface interB{
public abstract void printB();
}
interface interC extends interA,interB{}
class demo3 implements interA,interB{
//接口打破了java中的單繼承
public void printB() {
// TODO Auto-generated method stub
}
public void printA() {
// TODO Auto-generated method stub
}
}
類的三大特性
封裝性
將數據和操作封裝為一個有機的整體,由于類中私有成員都是隱藏的,只向外部提供有限的接口,所以能夠保證內部的高內聚性和與外部的低耦合性。用者不必了解具體的實現細節,而只是要通過外部接口,以特定的訪問權限來使用類的成員,能夠增強安全性和簡化編程。
繼承性
繼承性更符合認知規律,使程序更易于理解,同時節省不必要的重復代碼。
多態性
同一操作作用于不同對象,可以有不同的解釋,產生不同的執行結果。在運行時,可以通過指向基類的指針,來調用實現派生類中的方法
類的分類有:抽象類(abstract)、密封類(sealed)、靜態類(static)
用法
定義一個類
class類名
{
public:
公有成員
private:
私有成員
protected:
保護成員
};
公有成員、私有成員、保護成員均包含數據成員和成員函數兩部分,彼此沒有順序之分。一個public/private/protected關鍵字下可以跟多個成員,直到下一個public/private/protected關鍵字。如果成員前面沒有public/private/protected關鍵字,默認為私有成員。
結尾部分的分號必不可少,否則會發生編譯錯誤。
無論公有成員、私有成員還是保護成員,彼此之間都可以訪問。比如公有的成員函數可以操作保護的數據成員,也可以調用私有的成員函數。
類的數據成員是類型,所以不能被賦值,聲明數據成員和聲明普通變量的格式相同,比如“int n;”。
#e#
接口函數和調用函數有什么區別
接口函數
接口函數就是某個模塊寫了(主要)給其它模塊用的函數。簡單的說接口函數就是類中的公有函數。
例如:
SendMessage(。..); 是一個發消息的函數,我們無須知道它是怎么實現的,只需要知道他能實現向某個東西發送消息即可
這就是接口,接口對應的就是實現。
舉個例子,接口就是攪拌機,把蘋果,橘子。梨(參數)放進去(發送消息)就出來果汁(結果,返回值)了。
class 攪拌機
{
private:
零件;
public:
飲料 攪拌(水果); // 這個就是接口
};
int main(void)
{
攪拌機 A = new 攪拌機;
飲料 蘋果汁 = A-》 攪拌(一個黃元帥,兩個紅富士); // 調用接口
delete A;
return 0;
}
調用函數
計算機編譯或運行時,使用某個函數來完成相關命令。對無參函數調用時則無實際參數表。實際參數表中的參數可以是常數、變量或其它構造類型數據及表達式。各實參之間用逗號分隔。
一般形式
在程序中通過對函數的調用來執行函數體,其過程與其它語言的子程序調用相似。
C語言中,函數調用的一般形式為:
函數名(實際參數表)
對無參函數調用時則無實際參數表。實際參數表中的參數可以是常數、變量或其它構造類型數據及表達式。各實參之間用逗號分隔。
接口函數和調用函數是有區別的,例如:APP_int()是接口函數,APP_call()是可直接調用的函數。接口函數要重定義方法才能被調用,調用函數可理解為已經重寫方法的接口函數,APP_call()是可直接調用的函數這個就不用說了,假設APP_int()是接口函數 ,里面就有一個未實現方法要通過下面來實現。
如:
class tempa extends APP_init
{
//定義方法,使之成為類或可直接調用的函數
}
評論