程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中接口與抽象類的區別,

C#中接口與抽象類的區別,

編輯:C#入門知識

C#中接口與抽象類的區別,


  接口與抽象類是面試中經常會考到的點,容易混淆。首先了解下兩者的概念:

  一、抽象類:
      抽象類是特殊的類,只是不能被實例化;除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類中,且不包含任何實現,派生類必須覆蓋它們。另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。

  二、接口:      

  接口是引用類型的,類似於類,和抽象類的相似之處有三點:        

  1、不能實例化;       

  2、包含未實現的方法聲明;       

  3、派生類必須實現未實現的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員);

  另外,接口有如下特性: 接口除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他的成員,例如:常量、域、構造函數、析構函數、靜態成員。一個類可以直接繼承多個接口,但只能直接繼承一個類(包括抽象類)。

詳細的,定義上的區別分析,可以參考此篇博客:http://www.cnblogs.com/lovemyth/archive/2008/09/08/828909.html

  這裡概括、形象化地解釋一下接口和抽象類的區別:

  接口主要是對行為的抽象;抽象類主要是對類的抽象。

  更加形象的比喻如下:

  1.飛機會飛,鳥會飛,他們都繼承了同一個接口“飛”;但是F22屬於飛機抽象類,鴿子屬於鳥抽象類。
  2. 就像鐵門木門都是門(抽象類),你想要個門我給不了(不能實例化),但我可以給你個具體的鐵門或木門(多態);而且只能是門,你不能說它是窗(單繼承);一個門可以有鎖(接口)也可以有門鈴(多實現)。 門(抽象類)定義了你是什麼,接口(鎖)規定了你能做什麼(一個接口最好只能做一件事,你不能要求鎖也能發出聲音吧(接口污染))。

  代碼級的區別展示:

  一、抽象類:

  抽象類裡面可以包括部分具體實現,而接口則不行。

  

public abstract class AClass
{
    private int x;
    private int y;
    public int X { get { return x; } }
    public int Y { get { return y; } }
 
    public float Sum() { return X + Y; }
 
    public abstract float Average();
}
 
public class BClass : AClass
{
    public override float Average()
    {
        return Sum() / 2;
    }
}

  如上面的例子,在抽象類中,實際包括了:幾處具體的實現,二個屬性,一個求和方法。
  同時對於接口來說,根本就無法定義字段成員,也就是private int x,private int y;它是無法定義的。

  二、接口:

  對於接口實現同樣的功能,你只能做到:

public interface A
{
    public int X{get;}
    public int Y{get;}
    public float Sum();
}

  你無法提供Sum的任何功能。

 

  小結:

  1、我們在理解一門技術上,首先可以從其用處上來考慮,要認識到這門技術是做什麼用的。這樣才能加深對於知識的理解。後續項目中使用到了接口和抽象類會繼續完善此文檔。

  2、文章僅僅是自己的總結與體會(包括粘貼),希望能為大家提供到幫助。感謝CSDN的phy,和CNBLOG用戶殘葉。

 

  

  1. 上一頁:
  2. 下一頁: