在C#中使用關(guān)鍵字 abstract 來(lái)定義抽象類(lèi)和抽象方法。
不能初始化的類(lèi)被叫做抽象類(lèi),它們只提供部分實(shí)現,但是另一個(gè)類(lèi)可以繼承它并且能創(chuàng )建它們
的實(shí)例。
"一個(gè)包含一個(gè)或多個(gè)純虛函數的類(lèi)叫抽象類(lèi),抽象類(lèi)不能被實(shí)例化,進(jìn)一步
一個(gè)抽象類(lèi)只能通過(guò)接口和作為其它類(lèi)的基類(lèi)使用."- C++ Programming Language by Stroustrup Chapter13.2
抽象類(lèi)能夠被用于類(lèi),方法,屬性,索引器和事件,使用abstract 在一個(gè)類(lèi)聲明中表示該類(lèi)傾向要作為其它類(lèi)的基類(lèi)
成員被標示成abstract,或被包含進(jìn)一個(gè)抽象類(lèi),必須被其派生類(lèi)實(shí)現。
abstract class ShapesClass
{
abstract public int Area();
}
class Square : ShapesClass
{
int x, y;
// Not providing an Area method results
// in a compile-time error.
public override int Area()
{
return x * y;
}
}
例如,一個(gè)包含非抽象方法的抽象類(lèi):
abstract class MyAbs
{
public void NonAbMethod()
{
Console.WriteLine(
"Non-Abstract Method");
}
}
class MyClass : MyAbs
{
}
class MyClient
{
public static void Main()
{
//MyAbs mb = new MyAbs();//not possible to create an instance
MyClass mc =
new MyClass();
mc.NonAbMethod();
// Displays 'Non-Abstract Method'
}
}
一個(gè)抽象類(lèi)可以包含抽象和非抽象方法,當一個(gè)類(lèi)繼承于抽象類(lèi),那么這個(gè)派生類(lèi)必須實(shí)現所有的
的基類(lèi)抽象方法。
一個(gè)抽象方法是一個(gè)沒(méi)有方法體的方法。
abstract class MyAbs
{
public void NonAbMethod()
{
Console.WriteLine(
"Non-Abstract Method");
}
public abstract void AbMethod();
// An abstract method
}
class MyClass : MyAbs
//must implement base class abstract methods
{
public override void AbMethod()
{
Console.WriteLine(
"Abstarct method");
}
}
class MyClient
{
public static void Main()
{
MyClass mc =
new MyClass();
mc.NonAbMethod();
mc.AbMethod();
}
}
但是通過(guò)聲明派生類(lèi)也為抽象,我們可以避免所有或特定的虛方法的實(shí)現,
這就是抽象類(lèi)的部分實(shí)現。
abstract class MyAbs
{
public abstract void AbMethod1();
public abstract void AbMethod2();
}
//not necessary to implement all abstract methods
//partial implementation is possible
abstract class MyClass1 : MyAbs
{
public override void AbMethod1()
{
Console.WriteLine(
"Abstarct method #1");
}
}
class MyClass : MyClass1
{
public override void AbMethod2()
{
Console.WriteLine(
"Abstarct method #2");
}
}
class MyClient
{
public static void Main()
{
MyClass mc =
new MyClass();
mc.AbMethod1();
mc.AbMethod2();
}
}
在C#中,一個(gè)抽象類(lèi)能夠繼承另一個(gè)非抽象類(lèi),另外,繼承了基類(lèi)的方法,添加新的
抽象和非抽象方法是可行的。
class MyClass1
// Non-Abstract class
{
public void Method1()
{
Console.WriteLine(
"Method of a non-abstract class");
}
}
abstract class MyAbs : MyClass1
// Inherits from an non-abstract class
{
public abstract void AbMethod1();
}
class MyClass : MyAbs
//must implement base class abstract methods
{
public override void AbMethod1()
{
Console.WriteLine(
"Abstarct method #1 of MyClass");
}
}
class MyClient
{
public static void Main()
{
MyClass mc =
new MyClass();
mc.Method1();
mc.AbMethod1();
}
}
一個(gè)抽象類(lèi)也能從一個(gè)接口來(lái)實(shí)現,這種情況,我們必須為所有的方法提供方法體,這些方法是來(lái)自接口
interface IInterface
{
void Method1();
}
abstract class MyAbs : IInterface
{
public void Method1()
{
Console.WriteLine(
"Method implemented from the IInterface");
}
}
class MyClass : MyAbs
//must implement base class abstract method
{
}
class MyClient
{
public static void Main()
{
MyClass mc =
new MyClass();
mc.Method1();
}
}
我們不能把關(guān)鍵字abstract 和 sealed 一起用在C#中,因為一個(gè)密封類(lèi)不能夠被抽象。
abstract class MyAbs
{
public abstract void AbMethod1();
public abstract void AbMethod2();
}
class MyClass1 : MyAbs
{
public override void AbMethod1()
{
Console.WriteLine(
"Abstarct method #1 of MyClass1");
}
public override void AbMethod2()
{
Console.WriteLine(
"Abstarct method #2 of MyClass1");
}
}
class MyClient
{
public static void Main()
{
MyAbs ma1 =
new MyClass1();
// Polymorphism
ma1.AbMethod1();
ma1.AbMethod2();
}
}
抽象方法有以下特征:
1.一個(gè)抽象方法可以看作是一個(gè)虛函數。
2.抽象方法的聲明只能在抽象類(lèi)中。
3.因為抽象方法聲明只提供一個(gè)無(wú)實(shí)現的方式,沒(méi)有方法體
4.方法體的實(shí)現被覆寫(xiě)方法提供,覆寫(xiě)方法是一個(gè)非抽象類(lèi)的成員。
5.抽象屬性的行為和抽象方法相像,除了不同的聲明形式。
6.在一個(gè)靜態(tài)屬性中使用abstract 是一個(gè)錯誤。
*一個(gè)抽象屬性能夠通過(guò)派生類(lèi)使用 override 實(shí)現.
對于抽象類(lèi):
一個(gè)抽象類(lèi)必須為所有的接口成員提供實(shí)現
一個(gè)用于實(shí)現接口的抽象類(lèi)可能把接口方法安排到抽象方法上。例如
interface I
{
void M();
}
abstract class C: I
{
public abstract void M();
}
抽象類(lèi)具有以下特征:
1.抽象類(lèi)不能被實(shí)例化。
2.抽象類(lèi)可以包含抽象方法和訪(fǎng)問(wèn)器
3.不能把抽象類(lèi)用密封(sealed)來(lái)修飾,那就意味著(zhù)類(lèi)不能被繼承,這違反抽象類(lèi)被繼承的原則。
4.一個(gè)派生于一個(gè)抽象類(lèi)的非抽象類(lèi)必須包括所有的繼承來(lái)的抽象方法和訪(fǎng)問(wèn)器的實(shí)現
5.在方法和屬性中使用abstract 關(guān)鍵字意味著(zhù)包含它們的實(shí)現。未完待續......
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。