(教学思路 C#之类五)类的分类(静态类、实例类、嵌套类、结构、简单的抽象类、简单的密封类)...
???????本節(jié)課我們來學(xué)習類的擴展分類,看我的標題中就羅列出了類的分類,類按照聲明方式和功能定義共分為這六種類,實例類就是我們一直在用的類,class關(guān)鍵字前沒有其他的修飾符,之前已經(jīng)有很多實例類的使用方法了,我們今天主要是學(xué)習其他五種類。
?????靜態(tài)類
?
???? 靜態(tài)類就是在class關(guān)鍵字前加入了static關(guān)鍵字,基本語法是static? Class? ClassName{} 。
靜態(tài)類有幾個特點:
1.靜態(tài)類只能包括靜態(tài)成員
2.類本身無法被實例化,也就是不能創(chuàng)建靜態(tài)類的對象
3.靜態(tài)類無法被繼承
4.無法包含實例構(gòu)造方法
所以我們在創(chuàng)建靜態(tài)類的時候,必須注意到以上四點,下面的實例是簡單的靜態(tài)類的使用。
靜態(tài)類實例?1?class?Program
?2????{
?3????????static?void?Main(string[]?args)
?4????????{
?5????????????//靜態(tài)類不能被實例化,因為靜態(tài)類中的成員都是靜態(tài)的,調(diào)用靜態(tài)類中的成員使用類名引用。
?6???????????????Console?.WriteLine?(??StaticClass.a);?
?7????????}
?8????}
?9?????//定義一個靜態(tài)類名字叫做StaticClass
10????static?class?StaticClass
11????????{
12????????//定義一個靜態(tài)成員
13???????public??static?int?a=2;????
14????????}
結(jié)果就是2.
? 靜態(tài)類所提供的數(shù)據(jù)成員和方法成員具有唯一性,就如同使用了全局變量,所以比較適合封裝公用的成員。
結(jié)構(gòu)
?
????? 在c#中也有結(jié)構(gòu),結(jié)果就是幾個數(shù)據(jù)組成的數(shù)據(jù)結(jié)構(gòu),通常用來封裝小型相關(guān)變量組,結(jié)構(gòu)也可以看成是種輕量級的類,它的行為與類相似,但是不支持復(fù)雜的類功能,例如:繼承。在結(jié)構(gòu)中也可以創(chuàng)建各種成員,比如:構(gòu)造方法、常數(shù)、字段、方法、屬性、索引器、運算符、事件、嵌套類型等,但是如果往一個結(jié)構(gòu)中放入比較復(fù)雜的成員,對與結(jié)構(gòu)來說就和類沒有區(qū)別了,也就是失去了結(jié)構(gòu)的特點,這時應(yīng)該用創(chuàng)建類來代替創(chuàng)建結(jié)構(gòu)。結(jié)構(gòu)的基本語法是 public struct StructName{} 。
結(jié)構(gòu)在MSDN上的概述:
結(jié)構(gòu)是值類型,而類是引用類型。
與類不同,結(jié)構(gòu)的實例化可以不使用 new 運算符。
結(jié)構(gòu)可以聲明構(gòu)造函數(shù),但它們必須帶參數(shù)。
一個結(jié)構(gòu)不能從另一個結(jié)構(gòu)或類繼承,而且不能作為一個類的基。所有結(jié)構(gòu)都直接繼承自 System.ValueType,后者繼承自 System.Object。
結(jié)構(gòu)可以實現(xiàn)接口。
結(jié)構(gòu)的副本由編譯器自動創(chuàng)建和銷毀,因此不需要使用默認構(gòu)造函數(shù)和析構(gòu)函數(shù)。
在結(jié)構(gòu)聲明中,除非字段被聲明為 const 或 static,否則無法初始化。
?
????? 創(chuàng)建結(jié)構(gòu)對象的時候不需要使用new關(guān)鍵字,由于直接存儲對象數(shù)據(jù)、省略了對象引用的步驟,同時也就提升了使用性能,這就是使用結(jié)構(gòu)的好處。結(jié)構(gòu)同樣具有自己專門的默認構(gòu)造方法,它會自動引用,當然我們也可以創(chuàng)建自定義的構(gòu)造方法,而此時就需要使用new關(guān)鍵字,引用這個構(gòu)造方法了。看下面的代碼:
?
結(jié)構(gòu)體實例?1?class?Program
?2????{
?3????????static?void?Main(string[]?args)
?4????????{
?5????????????//創(chuàng)建結(jié)構(gòu)對象,不必使用new關(guān)鍵字
?6????????????StructName?structobj;
?7????????????structobj.kuan?=?3;
?8????????????structobj.chang?=?5;
?9??????????Console?.WriteLine?("面積是"+??structobj.Getmj());
10
11????????????//使用結(jié)構(gòu)體的構(gòu)造方法,必須使用和類創(chuàng)建對象的方法相同new
12??????????StructName?structobj1?=?new?StructName(4,6);
13????????}
14????}
15?????//定義一個靜態(tài)類名字叫做StructName
16????public?struct?StructName
17????????{
18????????public?int?chang;
19????????public?int?kuan;
20????????public??int?Getmj()
21????????{
22????????????return?chang?*?kuan;
23????????}
24
25?????//結(jié)構(gòu)體的構(gòu)造函數(shù)
26????????public?StructName(int?chang1,?int?kuan1)
27????????{
28???????????chang?=?chang1;
29????????????kuan?=?kuan1;
30????????????Console.WriteLine("使用構(gòu)造方法的面積是"?+?chang1?*kuan1);
31????????}
32????????}
?結(jié)果:
面積是15
使用構(gòu)造方法的面積是24。
????? 因為結(jié)構(gòu)聲明時無法初始化,所以在使用new創(chuàng)建結(jié)構(gòu)對象時,必須在定義結(jié)構(gòu)的有參構(gòu)造方法,給結(jié)構(gòu)中的已定義的無初值的變量賦一個值,否則就會報錯,如程序的第28、29行。大家可以試一試如果是在類的有參構(gòu)造方法中,即使沒有28、29行,也能正常的編譯出結(jié)果。
?? 嵌套類
???????? 在類一系列中,我也提到過類成員中還包括一中嵌套類,其實嵌套類就是類中的一個類,由于嵌套類在類的內(nèi)部,屬于外部類的內(nèi)部成員,所以外部類的private訪問權(quán)限對內(nèi)部類是無效的,也就是說,內(nèi)部類可以使用外部類的任何成員,創(chuàng)建嵌套類insideClassName的基本語法如下:
?
?????? Class? outclassName
???? {
?????public? class insideclassName??????????
?????????? {
??????????? }
??? }
????? 當外部程序代碼要訪問嵌套類的時候,必須引用外層類的名稱像引出外部類的其他靜態(tài)成員一樣使用類名加運算符“.”的方式,創(chuàng)建嵌套類的對象具體語法如下:
??????? outclassName.insideclassName?? obj=new??outclassName.insideclassName();
??????? 如果再用嵌套類的對象時,再使用obj.的方式引用出,我們來看下面的例子:
?
嵌套類實例?1namespace?hello
?2{
?3????class?program
?4????{
?5????????static?void?Main(string[]?args)
?6????????{
?7????????????//創(chuàng)建內(nèi)部類的實例,必須把內(nèi)部類作為靜態(tài)成員,使用外部類名來引用
?8????????????//而使用外部類的實例成員,必須使用外部類的對象來引用
?9????????????outclassName.insideclassName?i?=?new?outclassName.insideclassName();
10
11????????????//用內(nèi)部類的對象引用出內(nèi)部類的實例成員(方法say())
12????????????i.say();
13????????}
14????}
15????//定義一個外部類
16????class?outclassName
17????{
18????????//定義一個外部類的變量s,它的訪問權(quán)限是私有的。
19???????string?s?=?"我是外部類的變量s";
20????????//定義一個內(nèi)部類,因為它是外部類中的一個類成員,在第三方類(Program)中,
21????????//要想調(diào)用這個類中,就必須加上public,和其他外部類的公用方法一樣。
22???????public?class?insideclassName
23????????{
24????????????//創(chuàng)建一個外部類的對象o,用于便于內(nèi)部類訪問外部類成員。
25????????????outclassName?o?=?new?outclassName();
26????????????//定義一個內(nèi)部類的方法say
27????????????public?void?say()
28????????????{
29????????????????//調(diào)用外部類中的字段s,使用外部類的對象o來引用,而且s的訪問權(quán)限不必是public。
30????????????????Console.WriteLine("用內(nèi)部的方法調(diào)出外部的變量"+o.s);
31????????????}
32????????}
33????}
34???
35}
?結(jié)果就是:
用內(nèi)部的方法調(diào)出外部的變量我是外部類的變量s
請按任意鍵繼續(xù). . .
??????? 使用嵌套類注意:嵌套類要想被其他類訪問到,必須像外部類的一個公用成員一樣,要加public修飾符;創(chuàng)建嵌套類的對象時,要用外部類的類名來調(diào)用,這有點像把內(nèi)部的嵌套類作為外部類的一個靜態(tài)成員來使用;嵌套類要想使用外部類的成員,也是需要創(chuàng)建用外部類名(.靜態(tài)成員)或是外部類的對象(.實例成員)來調(diào)用,唯一與兩個并列類訪問不同的是,嵌套類可以調(diào)用外部類的私有成員(private修飾),而并列類只能用公有成員(public修飾)。
?????? 下面我們要來學(xué)習最后兩個類,這兩個類我在標題的時候注明了是簡單的抽象類和簡單的密封類,原因就是這兩個類都是面向?qū)ο笳Z言相對面向過程的一大進步,他們利用了面向?qū)ο蟮睦^承性,要想學(xué)懂這兩個類必須在學(xué)到繼承后,再相信的講解,這里我只是把他們的大體定義和基本結(jié)構(gòu)寫明,具體的應(yīng)用我會在學(xué)習繼承的時候,著重講解。
抽象類
?????? 在實際項目中,我們定義一個抽象類主要是為派生類提供可共享的基類的公共定義,抽象類中可以包括抽象成員,抽象成員就是沒有實現(xiàn),只有成員的定義,抽象成員具體由繼承這個包含抽象成員的抽象類的子類中的成員來實現(xiàn)。是不是很難理解呢?沒關(guān)系!同學(xué)們,現(xiàn)在我們只需要記住因為一個類中有了沒有實現(xiàn)的抽象成員,所以把這個類也定義為抽象類,也就是說,抽象成員一定在抽象類中,但是抽象類中可以沒有抽象成員,抽象類的和抽象成員都需要加入關(guān)鍵字abstract,下面我們來一定一個抽象類,并且這個抽象類中包括一個抽象方法,大家先記住他們的基本語法,日后我會詳細講解。???
抽象方法的基本語法1????//定義一個抽象類abstractclassName
2????abstract?class?abstractclassName
3????{
4????????//定義一個抽象方法abstractMethods
5????????abstract?public?void?abstractMethods();
6????}
7???
????? 使用抽象類還要記住二點,一:因為抽象類中有可能存在抽象成員,也就是存在沒有實現(xiàn)的成員,所以抽象類無法被實例化,也就是無法創(chuàng)建類的實例對象;二:定義抽象成員的時候,為了讓繼承的子類能夠?qū)崿F(xiàn)這個抽象方法,也就必須把抽象的成員定義成公有、或受保護的成員,這樣在抽象類的外部才能訪問到這個抽象成員。
密封類
?
???? 密封類的定義是通過sealed關(guān)鍵字來實現(xiàn)的,密封類可以用來限制擴展性,我也聽過把密封類叫成太監(jiān)類的說法,很形象的說明了密封類的特點,就是沒有子類,也就是密封類無法被繼承,這一點和靜態(tài)類一樣,下面來看看密封類的基本語法:
?sealed class sealedclassName
??? {
??????? 類的主體;
??? }
??? 密封類除了不能被繼承,其他的用法和實例類基本一致,可以有多個構(gòu)造方法,可以有靜態(tài)的、也可以有實例的,類的成員也是可以有靜態(tài)的和實例的。所以就不再演示密封類的用法了,對于密封類來說,它與面向?qū)ο缶幊碳夹g(shù)的靈活性和擴展性是相抵觸的,所以通常情況下,不建議定義密碼類。
??? 本節(jié)課就講到這里,下一節(jié)我們要來學(xué)習類六:索引器
?
轉(zhuǎn)載于:https://www.cnblogs.com/wangfang224120999/archive/2008/12/14/1354374.html
總結(jié)
以上是生活随笔為你收集整理的(教学思路 C#之类五)类的分类(静态类、实例类、嵌套类、结构、简单的抽象类、简单的密封类)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Delphi小技巧杂记
- 下一篇: [转载]C#中,让组合框(ComboBo