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