abstract(抽象)類和interface(接口)是面向對象編程中兩個概念,但是學了很多年編程的程序員有時對這兩個概念的區分仍然不是很清楚。下面就講解abstract類和interface的概念和區別。
abstract(抽象)類
抽象方法只作聲明,而不包含實現,可以看成是沒有實現體的虛方法。
抽象類不能被實例化。
抽象類可以但不是必須有抽象屬性和抽象方法,但是一旦有了抽象方法,就一定要把這個類聲明為抽象類。
具體派生類必須覆蓋基類的抽象方法。
抽象派生類可以覆蓋基類的抽象方法,也可以不覆蓋。如果不覆蓋,則其具體派生類必須覆蓋它們。
下面的代碼講解了abstract(抽象)類的使用方法。
using System;
public abstract class A //抽象類A
{
private int num = 0;
public int Num //抽象類包含屬性
{
get
{
return num;
}
set
{
num = value;
}
}
public virtual int getNum() //抽象類包含虛方法
{
return num;
}
public void setNum(int n) // //抽象類包含普通方法
{
this.num = n;
}
public abstract void E(); //類A中的抽象方法E
}
public abstract class B : A //由于類B繼承了類A中的抽象方法E,所以類B也變成了抽象類
{
}
public class C : B
{
public override void E() //重寫從類A繼承的抽象方法。如果類B自己還定義了抽象方法,也必須重寫
{
//throw new Exception("The method or operation is not implemented.");
}
}
public class Test
{
static void Main()
{
C c = new C();
c.E();
}
}
interface(接口)
接口不能被實例化。
接口只能包含方法聲明。
接口的成員包括方法、屬性、索引器、事件。
接口中的所有成員默認為public,因此接口中不能有private修飾符。
派生類必須實現接口的所有成員。
一個類可以直接實現多個接口,接口之間用逗號隔開。
一個接口可以有多個父接口,實現該接口的類必須實現所有父接口中的所有成員。
接口中不能包含常量、字段(域)、構造函數、析構函數、靜態成員。
下面的代碼講解了interface(接口)的使用方法。
public delegate void EventHandler(ob ject sender, Event e);
public interface ITest
{
//int x = 0;
int A
{
get;
set;
}
void
event EventHandler Event;
int this[int index]
{
get;
set;
}
}
抽象類和接口的相同點和區別
相同點
都可以被繼承
都不能被實例化
都可以包含方法聲明
派生類必須實現未實現的方法
區別
抽象基類可以定義字段、屬性、方法實現。接口只能定義屬性、索引器、事件、和方法聲明,不能包含字段。
新聞熱點
疑難解答