c#使用class關鍵字來定義類:
class myclass
這段**定義了乙個類myclass。
定義了乙個類後,就可以在專案中能訪問該定義的其他地方對該類進行例項化
。在預設情況下,
類宣告為內部的
,即只有當前專案中的**才能訪問它。可以用internal訪問修飾符關鍵字顯式指定,如下所示(但這是不必要的):
internal class myclass
另外,還可以指定類是公共的,應可以由其他專案中的**來訪問。為此,要使用關鍵字public。
public class myclass
注意:以這種方式宣告的類不能是私有或受保護的。可以把這些宣告類的修飾符用於宣告類成員,詳見第10章。
除了這兩個訪問修飾符關鍵字外,還可以
指定類是抽象的(不能例項化,只能繼承,可以有抽象成員)或密封的(sealed,不能繼承)。
為此,可以使用兩個互斥的關鍵字
abstract 或sealed
。所以,抽象類必須用下述方式宣告:
public abstract class myclass
其中myclass是乙個公共抽象類,也可以是內部抽象類。
密封類的宣告如下所示:
public sealed class myclass
與抽象類一樣,密封類也可以是公共或內部的。
還可以在類定義中指定繼承。為此,要在類名的後面加上乙個冒號,其後是基類名,例如:
public class myclass : mybase
注意,在c#的類定義中,只能有乙個基類,
如果繼承了乙個抽象類,就必須實現所繼承的所有抽象成員(除非派生類也是抽象的)。
編譯器不允許派生類的可訪問性比其基類更高。也就是說,內部類可以繼承於乙個公共類,但公共類不能繼承於乙個內部類。因此,下述**是合法的:
public class mybase
internal class myclass : mybase
但下述**不能編譯:
internal class mybase
public class myclass : mybase
如果沒有使用基類,則被定義的類就只繼承於基類system.object(它在c#中的別名是object)
。畢竟,在繼承層次結構中,
所有類的根都是system.object
,稍後將詳細介紹這個基類。
除了以這種方式指定基類外,還可以在冒號的後面指定支援的介面。如果指定了基類,它必須緊跟在冒號的後面,之後才是指定的介面。如果沒有指定基類,則介面就跟在冒號的後面。必須使用逗號分隔基類名(如果有基類)和介面名。
例如,給myclass新增乙個介面,如下所示:
public class myclass : imyinte***ce
所有的介面成員都必須在支援該介面的類中實現,但如果不想使用給定的介面成員,就可以提供乙個"空"的執行方式(沒有函式**)。還可以把介面成員實現為抽象類中的抽象成員。
下面的宣告是無效的,因為基類mybase不是繼承列表中的第一項:
public class myclass : imyinte***ce, mybase
指定基類和介面的正確方式如下:
public class myclass : mybase, imyinte***ce
可以指定多個介面,所以下面的**是有效的:
public class myclass : mybase, imyinte***ce, imysecondinte***ce
32表1是類定義中可以使用的訪問修飾符的組合。
表 1修 飾 符含 義
無或internal
類只能在當前專案中訪問
public
類可以在任何地方訪問
abstract 或internal abstract
類只能在當前專案中訪問,不能例項化,只能繼承
public abstract
類可以在任何地方訪問,不能例項化,只能繼承
sealed或internal sealed
類只能在當前專案中訪問,不能派生,只能例項化
public sealed
類可以在任何地方訪問,不能派生,只能例項化
介面的定義
宣告介面的方式與宣告類的方式相似
,但使用的關鍵字是inte***ce,而不是class,例如:
inte***ce imyinte***ce
訪問修飾符關鍵字public 和 internal的使用方式是相同的,與類一樣,介面也預設定義為內部介面。所以要使介面可以公開訪問,必須使用public關鍵字:
public inte***ce imyinte***ce
關鍵字abstract 和 sealed不能在介面中使用,因為這兩個修飾符在介面定義中是沒有意義的(它們不包含執行**,所以不能直接例項化,且必須是可以繼承的)。
介面的繼承也可以用與類繼承的類似方式來指定。主要的區別是可以使用多個基介面,例如:
public inte***ce imyinte***ce : imybaseinte***ce, imybaseinte***ce2
介面不是類,所以沒有繼承system.object。但是為了方便,system.object的成員可以通過介面型別的變數來訪問
。如上所述,不能用例項化類的方式來例項化介面。下面的示例提供了一些類定義的**和使用它們的**。
試試看:定義類
(1) 建立乙個新的控制台應用程式ch09ex01。
(2) 修改program.cs中的**,如下所示:
namespace ch09ex01
internal class myclass : mybase
public inte***ce imybaseinte***ce
internal inte***ce imybaseinte***ce2
internal inte***ce imyinte***ce : imybaseinte***ce, imybaseinte***ce2
internal sealed class mycomplexclass : myclass, imyinte***ce
class program}}
(3) 執行專案,結果如圖1所示。
圖 1
示例的說明
這個專案在下面的繼承層次結構中定義了類和介面,如圖2所示。
圖 2
這裡包含program,是因為這個類的定義方式與其他類的定義方式相同,而它不是主要類層次結構中的一部分。這個類處理的main()方法是應用程式的入口點。
mybase和imybaseinte***ce被定義為公共的,所以它們可以在其他專案中使用。其他類和介面都是內部的,只能在這個專案中使用。
main()中的**呼叫mycomplexclass的乙個例項myobj的tostring()方法:
mycomplexclass myobj = new mycomplexclass();
console.writeline(myobj.tostring());
這是繼承自system.object的乙個方法(圖中沒有顯示,因為該圖省略了這個類的成員),並把物件的類名作為乙個字串返回,該類名用所有相關的命名空間來限定。
c 類和C 中定義類的定義
c 類和c 中定義類的定義 相同處 1.1.都需要使用 class標識 1.2.都包含有成員 函式,屬性 1.3.都有private public protect 標識的成員 2.不同之處 2.2.c 申明類及成員時格式 class member 一般在class的末尾處需要乙個英文分割符號 pub...
C 類的定義
c 使用class關鍵字來定義類 class myclass 這段 定義了乙個類myclass。定義了乙個類後,就可以在專案中能訪問該定義的其他地方對該類進行例項化。在預設情況下,類宣告為內部的,即只有當前專案中的 才能訪問它。可以用internal訪問修飾符關鍵字顯式指定,如下所示 但這是不必要的...
C 類和類的定義
c 類和類的定義 在物件導向的程式設計中,有經常接觸類 物件等專業名詞 到底什麼是類 什麼是物件呢?在程式又是怎樣運用呢?類是物件導向程式設計的核心,它實際是一種新的資料型別,也是實現抽象型別的工具,因為類是通過抽象資料型別的方法來實現的一種資料型別。類是對某一類物件的抽象 而物件是某一種類的例項,...