用介面和抽象類,與不用究竟究竟有什麼區別或好處?
介面和抽象類關係很緊密,它們都具有對成員的抽象。
對於一個抽象類,至少一個方法是抽象方法既可,這意味著它也可以具有具體方法[譯註:Concrete Method,這只是相對於抽象方法而言,物件導向中並沒有這個概念]。
對於一個介面,所有的方法必須都是抽象的。
實現了一個介面的類必須為介面中的所有方法提供具體的實現,否則只能宣告為抽象類。
在C#中,多重繼承(Multiple Inheritance)只能通過實現多個介面得到。抽象類只能單繼承[注:C#中的單繼承是指所有類作為基類的時候都只能是派生類宣告中唯一的基類,而不僅僅是抽象類]。
介面定義的是一個契約,其中只能包含四種實體,即方法、屬性、事件和索引器。因此介面不能包含常數(Constant)、域、操作符、構造器、析構器、靜態構造器或型別[譯註:指巢狀的型別]。
同時,一個介面還不能包含任何型別的靜態成員。修飾符abstract、public、protected、internal、private、virtual、override都是不允許出現的,因為它們在這種環境中是沒有意義的。
類中實現的介面成員必須具有公有的可訪問性。
對於一個抽象類,至少一個方法是抽象方法既可,這意味著它也可以具有具體方法[譯註:Concrete Method,這只是相對於抽象方法而言,物件導向中並沒有這個概念]。
對於一個介面,所有的方法必須都是抽象的。
實現了一個介面的類必須為介面中的所有方法提供具體的實現,否則只能宣告為抽象類。
在C#中,多重繼承(Multiple Inheritance)只能通過實現多個介面得到。抽象類只能單繼承[注:C#中的單繼承是指所有類作為基類的時候都只能是派生類宣告中唯一的基類,而不僅僅是抽象類]。
介面定義的是一個契約,其中只能包含四種實體,即方法、屬性、事件和索引器。因此介面不能包含常數(Constant)、域、操作符、構造器、析構器、靜態構造器或型別[譯註:指巢狀的型別]。
同時,一個介面還不能包含任何型別的靜態成員。修飾符abstract、public、protected、internal、private、virtual、override都是不允許出現的,因為它們在這種環境中是沒有意義的。
類中實現的介面成員必須具有公有的可訪問性。
舉個最簡單例子吧.假如有個構建SQL語句的類.它有一個方法獲得任意字元萬用字元.為此,我們寫個抽象類:
public abstract class DbFactoryBase
{
//預設實現,萬用字元
public virtual string GetMultiLikeChar()
{
return "%";
}
}
//我們寫MSSQL的實現
public class SqlSvrFactory:DbFactoryBase
{
//GetMultiLikeChar方法不需要過載
}
//我們寫Jet的實現
public class JetFactory:DbFactoryBase
{
//過載,萬用字元
public override string GetMultiLikeChar()
{
return "*";
}
}
好處是顯而易見的,抽象類提供了預設實現,子類只在需要更改的時候才過載這個方法,我們這個類可以很容易擴充套件,比如增加對ORACLE的實現,呼叫這個抽象類的程式碼也不需要改變,但返回來的字元已經不同了.程式碼看上去也更簡潔...等等.這只是冰山之一角.建議多看看模式之類的書.
public abstract class DbFactoryBase
{
//預設實現,萬用字元
public virtual string GetMultiLikeChar()
{
return "%";
}
}
//我們寫MSSQL的實現
public class SqlSvrFactory:DbFactoryBase
{
//GetMultiLikeChar方法不需要過載
}
//我們寫Jet的實現
public class JetFactory:DbFactoryBase
{
//過載,萬用字元
public override string GetMultiLikeChar()
{
return "*";
}
}
好處是顯而易見的,抽象類提供了預設實現,子類只在需要更改的時候才過載這個方法,我們這個類可以很容易擴充套件,比如增加對ORACLE的實現,呼叫這個抽象類的程式碼也不需要改變,但返回來的字元已經不同了.程式碼看上去也更簡潔...等等.這只是冰山之一角.建議多看看模式之類的書.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-466027/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Components 與 Patterns 究竟有什麼區別
- Java 介面和抽象類是什麼,有什麼區別Java抽象
- Java培訓教程:”==“和 equals 方法究竟有什麼區別?Java
- Java技術分享:”==“和 equals 方法究竟有什麼區別?Java
- 抽象類與介面的區別抽象
- 抽象類和介面的區別抽象
- 介面和抽象類的區別抽象
- Java抽象類與介面的區別Java抽象
- Java中抽象類與介面的區別Java抽象
- Java中抽象類和介面的區別Java抽象
- JAVA中介面和抽象類的區別Java抽象
- Java:面試題:抽象類與介面的區別Java面試題抽象
- C#點滴 - 抽象類與介面區別C#抽象
- 做APP究竟有什麼好處,為什麼想要發展好的公司一定會做APP
- Dubbo和JDK的SPI究竟有何區別?JDK
- 選擇介面還是抽象類?---應用例項說明介面與抽象類的應用場合(區別)抽象
- 物聯網,你究竟有什麼神奇之處?
- java-介面和抽象類的聯絡和區別。Java抽象
- 多維度分析:抽象類和介面的區別抽象
- 運營的大資料究竟有什麼用?大資料
- 【Java基本功】聊聊抽象類和介面的區別Java抽象
- java中抽象類跟介面的區別Java抽象
- 抽象類與介面抽象
- 介面與抽象類抽象
- 抽象類和介面到底是什麼垃圾——秒懂抽象
- 介面和抽象類抽象
- 抽象類和介面抽象
- Java 8 中的抽象類和介面到底有啥區別?Java抽象
- 請問抽象介面有什麼用?抽象
- java和JavaScript究竟什麼關係,有什麼樣的區別JavaScript
- 為什麼我們鍾愛動作類遊戲,它究竟有什麼樣的魅力遊戲
- 全網醉火[智慧顯微鏡] 究竟有什麼神奇之處?
- 對我而言Linux究竟有什麼魅力Linux
- 介面和抽象類 (abstract)抽象
- 同樣是改需求,高手和菜鳥究竟有什麼不同?
- java 設計模式6原則 介面,抽象類區別Java設計模式抽象
- 有關“抽象類”和“介面”的異同之處?抽象
- 工廠模式和抽象工廠的區別是什麼?模式抽象