前言
大家應該都知道,在.Net中提供了接口,這個不同于Class或者Struct的類型定義。接口有些情況,看似和抽象類一樣,因此有些人認為在.Net可以完全用接口來替換抽象類。其實不然,接口和抽象類各有長處和缺陷,因此往往在應用當中,兩者要結合來使用,從而互補長短。下面話不多說,來一起看看詳細的介紹吧。
接下來先說說抽象類和接口的區別:
區別一,兩者表達的概念不一樣。抽象類是一類事物的高度聚合,那么對于繼承抽象類的子類來說,對于抽象類來說,屬于“是”的關系;而接口是定義行為規范,因此對于實現接口的子類來說,相對于接口來說,是“行為需要按照接口來完成”。這些聽起來有些虛,舉個例子。例如,狗是對于所有狗類動物的統稱,京哈是狗,牧羊犬是狗,那么狗的一般特性,都會在京哈,牧羊犬中找到,那么狗相對于京哈和牧羊犬來說,就屬于這類事物的抽象類型;而對于“叫”這個動作來說,狗可以叫,鳥也可以叫。很明顯,前者相當于所說的是抽象類,而后者指的就是接口。
區別二,抽象類在定義類型方法的時候,可以給出方法的實現部分,也可以不給出;而對于接口來說,其中所定義的方法都不能給出實現部分。
例如:
publicabstractclassAbsTest{publicvirtualvoidTest(){Debug.WriteLine("Test");}publicabstractvoidNewTest();}publicinterfaceITest{voidTest();voidNewTest();}區別三,繼承類對于兩者所涉及方法的實現是不同的。繼承類對于抽象類所定義的抽象方法,可以不用重寫,也就是說,可以延用抽象類的方法;而對于接口類所定義的方法或者屬性來說,在繼承類中必須要給出相應的方法和屬性實現。
區別四,在抽象類中,新增一個方法的話,繼承類中可以不用作任何處理;而對于接口來說,則需要修改繼承類,提供新定義的方法。
知道了兩者的區別,再來說說,接口相對于抽象類的優勢。
好處一,接口不光可以作用于引用類型,也可以作用于值類型。而抽象類來說,只能作用于引用類型。
好處二,.Net的類型繼承只能是單繼承的,也就是說一個類型只能繼承一個類型,而可以繼承多個接口。其實,我對于這一點也比較贊同,多繼承會使繼承樹變的混亂。
好處三,由于接口只是定義屬性和方法,而與真正實現的類型沒有太大的關系,因此接口可以被多個類型重用。相對于此,抽象類與繼承類的關系更緊密些。
好處四,通過接口,可以減少類型暴露的屬性和方法,從而便于保護類型對象。當一個實現接口的類型,可能包含其他方法或者屬性,但是方法返回的時候,可以返回接口對象,這樣調用端,只能通過接口提供的方法或者屬性,訪問對象的相關元素,這樣可以有效保護對象的其他元素。
新聞熱點
疑難解答
圖片精選