C#使用class關鍵字來定義類。其基本結構如下:
class MyClass
{
//類成員
}
定義一個類後,可以在項目中能訪問該定義的其他地方對該類進行執行個體化。在預設情況下,類聲明為內部的(internal),即只有當前項目中的代碼才能訪問他。可以用internal存取修飾詞顯式指定,但這是不必要的。另外,還可以指定類是公用的,則可以由其他項目中的代碼來訪問。為此,要使用關鍵字public。
pbulic class MyClass
{
//Class members
}
除了這兩個存取修飾詞關鍵字外,還可以指定類是抽象的(不能執行個體化,只能繼承,可以有抽象成員)或密封的(sealed,不能繼承)。為此,可以使用兩個互斥的關鍵字abstract或sealed。所以,抽象類別必須用下述方式聲明:
public abstract class MyClass
{
//Class members,may be abstract.
}
其中MyClass是一個公用抽象類別,也可以是內部抽象類別。密封類的聲明如下所示:
public sealed class MyClass
{
//Class members.
}
與抽象類別一樣,密封類也可以是公用或內部的。
還可以在類定義中指定繼承。為此,要在類名的後面加上一個冒號,其後面是基類名,例如:
public class MyClass : MyBase
{
//Class members.
}
注意,在C#的定義中,只能有一個基類,如果繼承了一個抽象類別,就必須實現所繼承的所有抽象成員(除非衍生類別也是抽象類別)。
編譯器不允許衍生類別的可訪問性比其基類更高。也就是說,內部類可以繼承於一個公用類,但公用類不能繼承於一個內部類,因此,下述代碼是合法的:
public class MyBase
{
//Class members.
}
internal class MyClass : MyBase
{
//Class members.
}
但下述代碼不能編譯:
internal class MyBase
{
//Class members.
}
public class MyClass : MyBase
{
//Class members.
}
如果沒有使用基類,則被定義的類就只繼承於基類System.Object(它在C#中的別名是object)。畢竟,在繼承階層中,所有類的根都是System.Object。
除了以這種方式指定基類外,還可以在冒號的後面指定支援的介面。如果指定了基類,它必須緊跟在冒號的後面,之後才是指定的介面。如果沒有指定基類,則介面就跟在冒號後面。必須使用逗號分隔基類名(如果有基類)和介面名。
例如,給MyClass添加一個介面,如下所示:
public class MyClass : IMyInterface
{
//Class members.
}
所有的介面成員都必須在支援該介面的類中實現,但如果不想使用給定的介面成員,可以提供一個"空"的執行方式(沒有函數代碼)。還可以把介面成員實現為抽象類別中的抽象成員。
下面的聲明是無效的,因為基類MyBase不是繼承列表中的第一項:
public class MyClass : IMyInterface,MyBase
{
//Class members.
}
指定基類和介面的正確方式如下:
public class MyClass : MyBase,IMyInterface
{
//Class members.
}
還可以指定多個介面,所以下面的代碼是有效:
public class MyClass : MyBase,IMyInterface,IMySecondInterface
{
//Class members.
}
表9-1 是類定義中可以使用的存取修飾詞的組合。
修飾符 |
含義 |
無或internal |
類只能在當前項目中訪問。 |
public |
類可以任何地方訪問。 |
abstract或internal abstract |
類只能在當前項目中訪問,不能執行個體化,只能繼承。 |
public abstract |
類可以在任何地方訪問,不能執行個體化,只能繼承。 |
sealed 或internal sealed |
類只能在當前項目中訪問,不能派生。 |
public sealed |
類可以在任何地方訪問,不能派生。 |
聲明介面的方式與聲明類的方式相似,但使用的關鍵字是interface,而不是class,例如:
interface IMyInterface
{
//Interface members.
}
存取修飾詞關鍵字public和internal的使用方式是相同的,所以要使介面可以公開訪問,必須使用關鍵字public:
public interface IMyInterface
{
//Interface members.
}
關鍵字abstract和sealed不能在介面中使用,因為這兩個修飾符在介面定義中是沒有意義的。
介面的繼承也可以用與類繼承的類似方式來指定。主要的區別是可以使用多個基底介面,例如:
public interface IMyInterface : IMyBaseInterface, IMyBaseInterface2
{
//Interface members.
}