什么是繼承
定義:繼承是面向對象編程語言中的一個重要特性,當一個類A能夠獲取另一個類B中所有非私有的數據和操作的定義作為自己的部分或全部成分時,就稱這兩個類之間具有繼承關系。被繼承的類B稱為父類或基類,繼承了父類的類A稱為子類或派生類。
繼承的優點
1. 減少代碼冗余
2. 提供代碼重用
3. 減少代碼量以及提高代碼可讀性
4. 代碼易於管理以及可划分父類和子類
5. 通過子類重寫父類的功能可支持代碼擴展
繼承的缺點
1. 父類變,子類不得不變,繼承會破壞包裝。父類實現細節暴露給子類,其實是增大了兩個類之間的耦合性
2. 在繼承結構中,很多數據成員仍然沒有被使用,分配給他們的內存沒有被利用;因此,如果你沒有正確地使用繼承,將影響程序性能
繼承的特點
1. 密封seald 類和密封方法不能被繼承,靜態類和普通類的靜態成員也不能被繼承
2. 派生類除了繼承父類的特性外,還可以有自己獨有特性
3. 子類不能擁有父類的私有成員
4. 子類可以以自己的方式實現父類的功能(即方法重寫)
繼承的特性
單根性:一個子類只能有一個父類
傳遞性:由A:B B:C=>A:C
實現繼承
如果要聲明派生自另一個類的一個類,就可以使用下面的語法 :
class MyDerivedClass: MyBaseClass { // functions and data members here
}
如果類(或結構)也派生自接口,則用逗號分隔列表中的基類和接口 :
public class MyDerivedClass: MyBaseC1ass, IInterface1, IInterface2 { // etc.
}
對於結構,語法如下 :
public struct MyDerivedstruct: IInterface1, IInterface2 { // etc.
}
如果在類定義中沒有指定基類,C#編譯器就假定System.Object是基類。因此下面的兩段代碼 生成相同的結果 :
class MyClass: object // derives from System.Object
{ // etc.
) 和 class MyClass // derives from System.Object
( // etc.
)
第二種形式比較常用,因為它較簡單。 C#支持object關鍵字,它用作System.Object類的假名,所以也可以編寫下面的代碼 :
class MyClass:Object // derives from System.Object
( // etc.
)
多重繼承
多重繼承指的是一個類別可以同時從多於一個父類繼承行為與特征的功能。與單一繼承相對,單一繼承指一個類別只可以繼承自一個父類。
C# 不支持多重繼承。但是,可以使用接口來實現多重繼承。下面的程序演示了這點:
using System; namespace InheritanceApplication { class Shape { public void setWidth(int w) { width = w; } public void setHeight(int h) { height = h; } protected int width; protected int height; } // 基類 PaintCost
public interface PaintCost { int getCost(int area); } // 派生類
class Rectangle : Shape, PaintCost { public int getArea() { return (width * height); } public int getCost(int area) { return area * 70; } } class RectangleTester { static void Main(string[] args) { Rectangle Rect = new Rectangle(); int area; Rect.setWidth(5); Rect.setHeight(7); area = Rect.getArea(); // 打印對象的面積
Console.WriteLine("總面積: {0}", Rect.getArea()); Console.WriteLine("油漆總成本: ${0}" , Rect.getCost(area)); Console.ReadKey(); } } }
當上面的代碼被編譯和執行時,它會產生下列結果:
要點:
- 子類不僅繼承了父類的公有成員,同時繼承了父類的私有成員,只是父類的私有成員在子類中不可被訪問;
- C#只允許單繼承,一個類只能繼承於一個父類;
- 被“sealed”關鍵字修飾的類將不能被繼承;
- 被“protected”修飾的成員或者數據可以直接被派生類訪問,屬於“可以在家族里分享的秘密”。
- 善用“base”關鍵字,顯示調用合適的自定義基類構造函數而不是使用默認構造函數。
- 繼承需要合理使用才能發揮最佳效果,一般情況下適用於“is a”關系,不適用“has a”關系。
- System.Object是所有類型的基類
- C#中繼承的寫法,class A:B{ }
- 構造方法不能繼承