-
-
抽象類具有以下特性:
- 抽象類不能實例化。
- 抽象類可以包含抽象方法和抽象訪問器。
- 不能用 sealed(C# 參考) 修飾符修飾抽象類,因爲這兩個修飾符的含義是相反的。 採用 sealed 修飾符的類無法繼承,而 abstract 修飾符要求對類進行繼承。
- 從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實際實現。
- 在方法或屬性聲明中使用 abstract 修飾符以指示方法或屬性不包含實現。
抽象方法具有以下特性:
- 抽象方法是隱式的虛方法。
- 只允許在抽象類中使用抽象方法聲明。
- 因爲抽象方法聲明不提供實際的實現,所以沒有方法體;方法聲明只是以一個分號結束,並且在簽名後沒有大括號 ({ })。
- 在抽象方法聲明中使用 static 或 virtual 修飾符是錯誤的。
在靜態屬性上使用 abstract 修飾符是錯誤的
在派生類中,通過包括使用 override 修飾符的屬性聲明,可以重寫抽象的繼承屬性。
抽象類不能實例化。抽象類的用途是提供多個派生類可共享的基類的公共定義。
抽象類的派生類必須實現所有抽象方法。當抽象類從基類繼承虛方法時,抽象類可以使用抽象方法重寫該虛方法。
例如:
// compile with: /target:library
public class D
{
public virtual void DoWork(int i)
{
// Original implementation.
}
}
public abstract class E : D
{
public abstract override void DoWork(int i);
}
public class F : E
{
public override void DoWork(int i)
{
// New implementation.
}
}
// compile with: /target:library
public class D
{
public virtual void DoWork(int i)
{
// Original implementation.
}
}
public abstract class E : D
{
public abstract override void DoWork(int i);
}
public class F : E
{
public override void DoWork(int i)
{
// New implementation.
}
}
如果將 virtual 方法聲明爲 abstract,則該方法對於從抽象類繼承的所有類而言仍然是虛方法。 繼承一個抽象方法的類不能訪問該方法的原始實現。在前面的示例中,類 F 中的 DoWork 不能調用類 D 中的 DoWork。 通過這種方式,抽象類可以強制派生類爲虛方法提供新的方法實現。
抽象類設計
任何情況下,抽象類都不應進行實例化,因此,正確定義其構造函數就非常重要。確保抽象類功能的正確性和擴展性也很重要。下列準則有助於確保抽象類能夠正確地設計並在實現後可以按預期方式工作。
不要在抽象類型中定義公共的或受保護的內部(在 Visual Basic 中爲 Protected Friend)構造函數。
具有 public 或 protected internal 可見性的構造函數用於能進行實例化的類型。 任何情況下抽象類型都不能實例化。
應在抽象類中定義一個受保護構造函數或內部構造函數。
如果在抽象類中定義一個受保護構造函數,則在創建派生類的實例時,基類可執行初始化任務。內部構造函數可防止抽象類被用作其他程序集中的類型的基類。
對於您提供的每個抽象類,至少應提供一個具體的繼承類型。
這樣有助於庫設計者在設計抽象類時找到問題所在。同時意味着開發人員在進行高級別開發時,即使不瞭解抽象類和繼承,也可以使用具體類而不必學習這些概念。