類是物件導向程式設計的核心概念之一。
1、類的定義
簡單的定義就不多說了,之間看下錶,修飾符的含義(使用abstract關鍵字的類是抽象類別,這種類不能被執行個體化,只能被繼承;而使用sealed關鍵字的類是封裝類,這種類只能執行個體化,不能繼承):
需要使用“:”來繼承基類和介面,最多可同時繼承一個基類以及很多介面,它們之間需要用“,”隔開。如:
public class MyClass : Mybase, IMyInterface, IMySecondInterface
{
}
2、介面的定義
介面的定義方式與類相差不大,不活使用的是interface關鍵字,而不是class。例如:
interface IMyinterface
{
//Interface members
}
由於介面不包含執行代碼,所以也就沒有抽象介面的概念,所以在聲明介面是一般使用public 和internal,不能使用abstract和sealed。
3、建構函式和解構函式
所有的類都有個預設的建構函式,該函數沒有參數,與類同名。我們在類的定義中可以包含幾個帶參數的建構函式,成為非預設的建構函式。在執行個體化對象時用new來選擇使用哪個建構函式。
class MyClass
{
public MyClass()
{
//Default constructor code
}
public MyClass(int myInt)
{
//Nondefault constructor code(use myInt)
}
}
MyClass myClass = new MyClass(3);
解構函式主要用於清理對象,聲明格式如下:
class MyClass
{
~MyClass()
{
//Destructor body
}
}
建構函式的執行序列
在執行個體化一個衍生類別時,必須先執行個體化這個衍生類別的基類,也就要先執行個體化這個基類的基類,以此類推,就要先執行個體化object類。
因此無論執行個體化一個什麼類,都需要先執行個體化System.Object類,也就是先執行System.Object.Object()。
如果一個類使用非預設的建構函式,預設的情況是在其基類上尋找匹配於這個建構函式簽章的建構函式。如果沒有找到,則使用基類的預設建構函式。例如:
如果以下面的方式執行個體化:
MyDerivedClass myObj = new MyDerivedClass();
則執行的順序如下:System.Object.Object()——MyBaseClass.MyBaseClass()——MyDerivedClass.MyDerivedClass()
MyDerivedClass myObj = new MyDerivedClass(1);
則執行的順序如下:System.Object.Object()——MyBaseClass.MyBaseClass(int i)——MyDerivedClass.MyDerivedClass(int i)
MyDerivedClass myObj = new MyDerivedClass(1,1);
則執行的順序如下:System.Object.Object()——MyBaseClass.MyBaseClass()——MyDerivedClass.MyDerivedClass(int i, int j)
但是如果希望執行的順序為:System.Object.Object()——MyBaseClass.MyBaseClass(int i)——MyDerivedClass.MyDerivedClass(int i, int j)
則需要將MyDerivedClass的非預設建構函式改為:
public class MyDerivedClass : MyBaseClass
{
...
public MyDerivedClass(int i, int j) : base(i)
{
}
}
base關鍵字指定.net執行個體化過程使用基類中匹配指定簽名的建構函式。
除了base關鍵字外,還有一個this關鍵字,它指定在調用指定的建構函式前,.net執行個體化過程對當前類使用非預設的建構函式。如:
public class MyDerivedClass : MyBaseClass
{
public MyDerivedClass() : this(5, 6)
{
}
...
public MyDerivedClass(int i, int j) : base(i)
{
}
}
則執行的順序如下:System.Object.Object()——MyBaseClass.MyBaseClass(int i)——MyDerivedClass.MyDerivedClass(int i, int j)——MyDerivedClass.MyDerivedClass()