可以指定類是抽象的abstract(不能執行個體化,只能繼承,可以有抽象成員)或密封的sealed(不能繼承)
抽象類別聲明:
public abstract class MyClass{}
密封類聲明:
pulbic sealed class MyClass{}
繼承和介面:(類名後面加冒號,其後是基類名或介面)
public class MyClass:MyBase{} //繼承
public class MyClass:IMyInterface{} //介面
public class MyClass:MyBase,IMyInterface{} //先指定基類,然後才是介面
注意:
1.C#中,只能有一個基類,如果繼承了一個抽象類別,就必須實現所繼承的所有抽象成員(除非衍生類別也是抽象的
)
2.所有的介面成員都必須在支援該介面的類中實現
3。可以把介面成員實現為抽象類別中的抽象成員
介面:
interface IMyInterface{}
注意:
1.關鍵字abstract和sealed不能在介面中使用
2.介面的繼承也可以用與類繼承的類似方式來指定。主要區別是可以使用多個基底介面
public interface IMyInterface:IMyInterface,IMyBaseInterface2{}
3.介面不是類,所以沒有繼承System.Object
建構函式和解構函式
class MyClass
{
public MyClass(){} //預設建構函式
public MyClass(){int myInt)} //重載建構函式
~MyClass(){} //解構函式
}
注意:
1.在調用解構函式後,還將隱式地調用基類的解構函式,包括System.Object根類中的Finalize()的調用
2.無論用什麼建構函式執行個體化一個類,總是要先調用System.Object.Object()
3.建構函式初始化器,它把代碼放在方法定義的冒號後面。這樣可以在衍生類別的建構函式定義中指定所使用的
基類的建構函式
public class MyDerivedClass:MyBaseClass
{
....
public MyDerivedClass(int i,int j):base(i)
{
}
}
base關鍵字指定.net執行個體化過程使用基類中有指定參數的建構函式
除了base關鍵字外,這裡還可以使用另一個關鍵字this作為建構函式初始化器。這個關鍵字指定在調用指定的
建構函式前,.net執行個體化過程當前類使用非預設的建構函式。
介面和抽象類別
類似:
1.抽象類別和介面都包含可以由衍生類別繼承的成員
2.介面和抽象類別都不能直接執行個體化,但可以聲明它們的變數。如果這樣做,就可以用多態性把繼承這兩種類型
的對象指定給它們的變數。接著通過這些變數來使用這些類型的成員,但不能直接存取派生對象的其他成員
區別:
1.衍生類別只能繼承一個基類,即只能直接繼承一個抽象類別
2.相反,類可以使用任意多個介面
3.抽象類別可以擁有抽象成員(沒有代碼體,且必須在衍生類別中實現,否則衍生類別本身必須也是抽象的)和非抽象
成員(它們擁有代碼體,也可以是虛擬,這樣就可以在衍生類別中重寫)
4.介面成員必須都在使用介面的類上實現---它們沒有代碼體
5.介面成員是公用的(因為它們傾向於在外部使用),但抽象類別的成員可以是私人的(只要它們不是抽象的),受
保護的,內部的或受保護的內部成員(其中受保護的內部成員只能在應用程式的代碼或衍生類別中訪問)
6.介面不能包含欄位,建構函式,解構函式,靜態成員或常量