C 類的定義

2021-07-05 16:47:57 字數 3762 閱讀 4348

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 類和類的定義 在物件導向的程式設計中,有經常接觸類 物件等專業名詞 到底什麼是類 什麼是物件呢?在程式又是怎樣運用呢?類是物件導向程式設計的核心,它實際是一種新的資料型別,也是實現抽象型別的工具,因為類是通過抽象資料型別的方法來實現的一種資料型別。類是對某一類物件的抽象 而物件是某一種類的例項,...