-
當(dāng)前位置:首頁(yè) > 創(chuàng)意學(xué)院 > 技術(shù) > 專(zhuān)題列表 > 正文
為什么要定義接口(為什么要定義接口而不是直接實(shí)現(xiàn))
大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于為什么要定義接口的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。
開(kāi)始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫(xiě)出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端
官網(wǎng):https://ai.de1919.com
本文目錄:
一、j2ee項(xiàng)目里面service層里面為什么要建立一個(gè)接口,一個(gè)實(shí)現(xiàn)類(lèi)
分別定義接口和實(shí)現(xiàn)類(lèi)是java架構(gòu)思想中開(kāi)閉原則的體現(xiàn),對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。舉個(gè)例子:假如你這個(gè)注冊(cè)剛開(kāi)始是對(duì)國(guó)內(nèi)用戶開(kāi)放,中國(guó)用戶注冊(cè)成功返回“注冊(cè)成功”,隨著業(yè)務(wù)擴(kuò)展,需要海外用戶開(kāi)放,假如美國(guó)用戶返回“register success”,如果你有接口,可以再美國(guó)的AmericaUserServiceImpl.java中實(shí)現(xiàn)一個(gè)UserService.java的接口,來(lái)定義美國(guó)用戶的注冊(cè)業(yè)務(wù),而不是在之UserServiceImpl.java中增加if else來(lái)對(duì)不同邏輯進(jìn)行處理,這樣,后續(xù)如果某個(gè)地區(qū)的注冊(cè)業(yè)務(wù)有變動(dòng),只需要修改對(duì)應(yīng)地區(qū)的實(shí)現(xiàn)類(lèi),修改不會(huì)影響到其他地區(qū)的實(shí)現(xiàn)類(lèi),降低了耦合性。
對(duì)于小型項(xiàng)目來(lái)說(shuō),確實(shí)可以不用多寫(xiě)一個(gè)接口,直接寫(xiě)實(shí)現(xiàn)類(lèi)就可以了。接口+實(shí)現(xiàn)類(lèi)是一種良好的編碼習(xí)慣而已。就好像寫(xiě)代碼時(shí)候的縮進(jìn)和駝峰命名法。
二、Java中的接口可以定義成空接口嗎?如果可以,那為什么要定義成空接口?
Java中的接口可以定義成空接口嗎?
答:可以
如果可以,那為什么要定義成空接口?
答:可以起一個(gè)標(biāo)記作用,既是像樓上說(shuō)的Serializable一樣,它標(biāo)志這個(gè)類(lèi)可以被序列化而已.
可以通過(guò)這個(gè)標(biāo)記接口來(lái)判斷某個(gè)類(lèi)是否可以實(shí)現(xiàn)某種功能.
具體判斷方法如下
假設(shè)類(lèi)A存在,標(biāo)志接口Mark
if(Mark.class.isAssignableFrom(A.class)){....}
或
if(Mark.class.isInstance(new A())){....}
三、什么是接口?接口的主要功能是什么
是指同一計(jì)算機(jī)不同功能層之間的通信規(guī)則稱(chēng)為接口。
主要功能是:對(duì)協(xié)定進(jìn)行定義的引用類(lèi)型。其他類(lèi)型實(shí)現(xiàn)接口,以保證它們支持某些操作。接口指定必須由類(lèi)提供的成員或?qū)崿F(xiàn)它的其他接口。與類(lèi)相似,接口可以包含方法、屬性、索引器和事件作為成員。
擴(kuò)展資料
Java里的接口:
Java里面由于不允許多重繼承,所以如果要實(shí)現(xiàn)多個(gè)類(lèi)的功能,則可以通過(guò)實(shí)現(xiàn)多個(gè)接口來(lái)實(shí)現(xiàn)。
Java接口和Java抽象類(lèi)代表的就是抽象類(lèi)型,就是我們需要提出的抽象層的具體表現(xiàn)。OOP面向?qū)ο蟮木幊?,如果要提高程序的?fù)用率,增加程序的可維護(hù)性,可擴(kuò)展性,就必須是面向接口的編程,面向抽象的編程,正確地使用接口、抽象類(lèi)這些太有用的抽象類(lèi)型做為java結(jié)構(gòu)層次上的頂層。
Java接口和Java抽象類(lèi)最大的一個(gè)區(qū)別,就在于Java抽象類(lèi)可以提供某些方法的部分實(shí)現(xiàn),而Java接口不可以,這大概就是Java抽象類(lèi)唯一的優(yōu)點(diǎn)吧,但這個(gè)優(yōu)點(diǎn)非常有用。
四、c#中為什么要用接口
你要把接口也理解成一種類(lèi),比如有個(gè)基類(lèi)叫baseClass,一個(gè)繼承他的類(lèi)叫subClass,那么subClass也算是baseClass類(lèi)型的,可以有這樣的寫(xiě)法baseClass bc=new subClass()
接口也是一樣,如果一個(gè)類(lèi)MyClass實(shí)現(xiàn)了借口一個(gè)接口interfaceClass,你事實(shí)上可以把MyClass叫做interfaceClass的子類(lèi),可以有這樣的寫(xiě)法interfaceClass ic=new MyClass()
這就是所說(shuō)的多態(tài)的一部分基礎(chǔ)??梢耘e個(gè)實(shí)在點(diǎn)的例子,比如你想寫(xiě)一個(gè)方法叫EnumAll,參數(shù)是一個(gè)類(lèi)的實(shí)例,作用是例舉出該實(shí)例中的每個(gè)子元素并打印出元素的ToString(如窗體的子元素是窗體中的控件,數(shù)組的子元素就不用說(shuō)了吧),你就遇到兩個(gè)問(wèn)題
首先EnumAll參數(shù)的類(lèi)型是什么。參數(shù)應(yīng)該可以是一個(gè)Form類(lèi)型,因?yàn)榇翱谥杏泻芏嗫丶褂肊numAll和一個(gè)Form的實(shí)例做參數(shù)可以打印出包含在該參數(shù)窗體中的每個(gè)控件的名字;但是一個(gè)數(shù)組Object[]類(lèi)型應(yīng)該也可以使用EnumAll方法,EnumAll可以列舉Object[]中的每個(gè)元素并打印。你是要把方法寫(xiě)成void EnumAll(Form e)還是寫(xiě)成void EnumAll(Object[] e)?
然后就是EnumAll怎樣實(shí)現(xiàn)才能得到不同類(lèi)型的實(shí)例的子元素?如果是void EnumAll(Form e)的形式,要想得到子元素要用
foreach(Control c in e.Controls)
{
Console.WriteLine(c.ToString());
}
的寫(xiě)法,如果數(shù)組要用
for(int i=0;i<e.length;++i)
{
Console.WriteLine(e[i].ToString());
}
的實(shí)現(xiàn)方法。
Form和Object[]是兩種完全不沾邊的類(lèi)型,那么EnumAll到底該怎么寫(xiě)?
這時(shí)就可以使用接口,可以定義一個(gè)接口
interface IEnumable
{
Object next();//返回下一個(gè)子元素的方法
}
然后使Form和Object[]類(lèi)型都實(shí)現(xiàn)IEnumable接口(實(shí)現(xiàn)方法是不同的,如前面所說(shuō)),然后這樣寫(xiě)EnumAll方法:
void EnumAll(IEnumable e)//一開(kāi)始就說(shuō)了,實(shí)現(xiàn)接口的類(lèi)都可以算是接口的子類(lèi)
{Object o;
while((o=e.next)!=null)
{
Console.WriteLine(o.ToString());
}
}
于是解決了上面的問(wèn)題。
不知道有沒(méi)有說(shuō)清楚,如果理解了上面舉的例子算是初步了解接口了,接口的多繼承和多態(tài)性還有很多內(nèi)容。
另外,上面的東西只是舉例子,雖然C#中確實(shí)有IEnumable接口,但其定義要復(fù)雜的多,我只是舉個(gè)簡(jiǎn)化的自己編的例子^_^。C#的(應(yīng)該說(shuō)是FCL吧)很多類(lèi)都實(shí)現(xiàn)了IEnumalbe接口,像集合類(lèi)和數(shù)組等。
FCL是.NET框架類(lèi)庫(kù),F(xiàn)ramework Class Library,不論在C#,J#,VB.NET或其他.NET開(kāi)發(fā)語(yǔ)言中使用的.NET提供的類(lèi)都是FCL中的類(lèi),就是說(shuō),.NET的開(kāi)發(fā)其實(shí)是和語(yǔ)言無(wú)關(guān)的。不同語(yǔ)言編寫(xiě)的程序由于使用同一類(lèi)庫(kù)(其實(shí)等于被翻譯成了同一種中間語(yǔ)言,Common Intermediate Language, CIL),使得各種不同語(yǔ)言寫(xiě)的程序集可以通用。
以上就是關(guān)于為什么要定義接口相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
為什么很多人喜歡學(xué)化學(xué)(為什么很多人喜歡學(xué)化學(xué)專(zhuān)業(yè))
微店顯示請(qǐng)聯(lián)系買(mǎi)家微信認(rèn)證(微店買(mǎi)家為什么要身份驗(yàn)證)
手機(jī)鎖屏再開(kāi)啟有廣告(手機(jī)鎖屏再開(kāi)啟有廣告怎么取消)
王者榮耀競(jìng)猜幣(王者榮耀競(jìng)猜幣會(huì)清空嗎)
猜你喜歡
藝術(shù)設(shè)計(jì)為什么難就業(yè)(藝術(shù)設(shè)計(jì)畢業(yè)了干什么工作的)
倫敦藝術(shù)大學(xué)倫敦時(shí)裝學(xué)院(倫敦藝術(shù)大學(xué)倫敦時(shí)裝學(xué)院學(xué)費(fèi))
0xc000000f進(jìn)不了系統(tǒng)怎么修復(fù)(0xc000000f怎么修復(fù)win7系統(tǒng))
松江科創(chuàng)云廊在哪里(松江科創(chuàng)云廊在哪里建)
vrchat創(chuàng)建不了賬號(hào)(vrchat怎么注冊(cè))
問(wèn)大家
在德國(guó)抖音為什么不能直播?抖音能在德國(guó)直播嗎?
為什么不把手寫(xiě)板設(shè)計(jì)成電腦的第二屏幕,這樣書(shū)寫(xiě)準(zhǔn)確性才高?
為什么說(shuō)自媒體視頻大V,大多數(shù)人最后都會(huì)選擇直播帶貨?
為什么有人說(shuō)有些設(shè)計(jì)師都很傲氣?幫朋友設(shè)計(jì)東西還要收錢(qián)?
蘇州相城區(qū)營(yíng)業(yè)執(zhí)照注銷(xiāo)在哪里辦?