国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

4、類和封裝

2019-11-17 02:34:27
字體:
供稿:網(wǎng)友

4、類和封裝

2015-02-09 09:04 by 七星端硯, ... 閱讀, ... 評論, 收藏, 編輯 本學習主要參考Andrew Troelsen的C#與.NET4高級程序設計,這小節(jié)主要述說以下幾個東西:

1、構(gòu)建支持任意數(shù)量的構(gòu)造函數(shù)的定義明確的類類型。

2、類和分配對象的基本知識

3、封裝的作用

4、定義類屬性以及靜態(tài)成員、對象初始化語法、只讀字段、常亮和分部類的作用

C#類類型

.net平臺最基本的編程結(jié)構(gòu)就是類類型,正式的說,類是由字段數(shù)據(jù)(成員變量)以及操作這個數(shù)據(jù)的成員(構(gòu)造函數(shù)、屬性、方法、事件等)所構(gòu)成的自定義類型。總的來說,其中的字段數(shù)據(jù)用于表示類實例的‘狀態(tài)’(對象)。C#這樣基于對象的語言的強大之處就在于,通過將數(shù)據(jù)和相關功能集合在類定義中,我們就可以仿照現(xiàn)實生活中的實體來設計軟件。(面相對象)類定義://關鍵字是class,類名是Car class Car { //Car的狀態(tài) public string petName; public int currSpeed; //Car的功能 public void PRintState() { Console.WriteLine("{0} is going {1} MPH.", petName, currSpeed); } public void SpeedUp(int delta) { currSpeed += delta; } }說明,雖然上述我們用了兩個共有字段表示類的‘狀態(tài)’,但是類的字段很少定義為公有的,為了保護狀態(tài)數(shù)據(jù)完整,我們一般將字段定義為私有,并且通過類型屬性對數(shù)據(jù)提供受控制的訪問。上面定義了成員變量,那么描述其行為的就是成員,例如上述類中的一個SpeedUp()方法和一個PrintState()方法.在Program類中寫入如下代碼: static void Main(string[] args) { Console.WriteLine("****Fun with class types****"); Car myCar = new Car(); myCar.petName = "Henry"; myCar.currSpeed = 10; for (int i = 0; i <= 10; i++) { myCar.SpeedUp(5); myCar.PrintState(); } Console.ReadLine(); }當我們運行程序就看到類方法輸出的狀態(tài)數(shù)據(jù)。new關鍵字:對象必須用new關鍵字來分配到內(nèi)存中。new關鍵字主要是為了把引用付給對象。只有new之后才會把引用賦給對象,這個引用才會指向沒村中的有效類實例。

構(gòu)造函數(shù)

如果希望在使用對象前就先給對象字段數(shù)據(jù)賦值,那么就用到了構(gòu)造函數(shù)。構(gòu)造函數(shù)是類的特殊方法,在使用new關鍵字創(chuàng)建對象時被間接調(diào)用。然而和‘普通’方法不同,構(gòu)造函數(shù)永遠不會有返回值,并且他的名字總是和需要構(gòu)造的類的名字相同。

1.默認構(gòu)造函數(shù)的作用:

每個C#類都提供了內(nèi)建的默認構(gòu)造函數(shù),需要時可以重新定義。根據(jù)定義,默認構(gòu)造函數(shù)不會接受任何參數(shù)。在上類中更新如下方法: public Car() { petName = "GoodGirl"; currSpeed = 10; }當我們創(chuàng)建對象之后,直接調(diào)用PrintState方法就會打印出來GoodGirl is going 10 MPH.

2.定義自定義的構(gòu)造函數(shù):

除了默認構(gòu)造函數(shù),我們還可以自定義不同的構(gòu)造函數(shù)。讓構(gòu)造函數(shù)彼此不同的是構(gòu)造函數(shù)參數(shù)的個數(shù)和類型。當我們定義了具有同樣名字但參數(shù)數(shù)量和類型不同的方法時,就是重載方法。因此,我們自定義構(gòu)造函數(shù)相當于是方法重載。比如除了上述的構(gòu)造函數(shù),我們還可以構(gòu)造如下: public Car(string p) { petName = p; }

3.再談默認構(gòu)造函數(shù):

如果自定義了構(gòu)造函數(shù),那么默認的構(gòu)造函數(shù)就會自動從類中移除,不再有效。因此,如果希望對象用戶使用默認構(gòu)造函數(shù)和自定義構(gòu)造函數(shù)創(chuàng)建類型實例,就必須顯示重新定義默認構(gòu)造函數(shù)。如下新建一個類所示: class Motorcycle { public intintensity; public void PopAWheely() { for (int i = 0; i <=intensity; i++) { Console.WriteLine("aaaa hhhhh!"); } } //顯示默認構(gòu)造函數(shù) public Motorcycle() { } //自定義構(gòu)造函數(shù) public Motorcycle(int intensity) { this.intensity= intensity; } }

this關鍵字的作用

C#支持this關鍵字來提供對當前類實例的訪問。this關鍵字可能的用途就是,解決了當傳入?yún)?shù)的名字和類型數(shù)據(jù)字段的名字相同時產(chǎn)生的作用域歧義。如上例所示,最后一個構(gòu)造函數(shù)的里面,this.intensity指的是類中定義的字段,而給他賦值的那個intensity則是構(gòu)造函數(shù)的參數(shù)。說明:在靜態(tài)成員的實現(xiàn)中實現(xiàn)this關鍵字,會產(chǎn)生編譯錯誤。我們知道,靜態(tài)成員在類(而不是對象)級別產(chǎn)生作用,因此在類級別沒有當前對象(也就沒有this)。

1.使用this進行串聯(lián)構(gòu)造函數(shù)調(diào)用(簡化編程):

this關鍵字的另一種用法就是使用一項名為構(gòu)造函數(shù)鏈的技術來設計類,當類定義了多個構(gòu)造函數(shù)時,這個設計模式就會很有用。如果多個構(gòu)造函數(shù)有相同的處理邏輯,但是參數(shù)不一樣,則很容易產(chǎn)生代碼冗余。這時候,this關鍵字串聯(lián)就非常有用,我們可以如下構(gòu)造:就是讓一個接受最多參數(shù)個數(shù)的構(gòu)造函數(shù)做朱構(gòu)造函數(shù),并且實現(xiàn)必須的驗證邏輯。 //默認構(gòu)造函數(shù) public Motorcycle() { } //構(gòu)造函數(shù)鏈 public Motorcycle(int intensity) : this(intensity, "") { } public Motorcycle(int intensity, string name) { if (intensity>10) { intensity = 10; } driverIntensity = intensity; driverName = name; }

2.構(gòu)造函數(shù)流程:

我們要知道,在構(gòu)造函數(shù)傳遞參數(shù)給指定的主構(gòu)造函數(shù)(并且構(gòu)造函數(shù)處理了數(shù)據(jù))之后,調(diào)用者最初調(diào)用的構(gòu)造函數(shù)還會執(zhí)行所有剩余的代碼語句。(即走完構(gòu)造函數(shù)中所有流程)。構(gòu)造函數(shù)的邏輯流程如下:
  1. 通過調(diào)用只有單個int的構(gòu)造函數(shù)來創(chuàng)建對象。
  2. 構(gòu)造函數(shù)將提供的數(shù)據(jù)轉(zhuǎn)發(fā)給主構(gòu)造函數(shù),并且提供調(diào)用者沒有提供的其他初始參數(shù)。
  3. 主構(gòu)造函數(shù)把傳入的參數(shù)賦值給對象的字段數(shù)據(jù)。
  4. 控制返回到最初調(diào)用的構(gòu)造函數(shù),并且執(zhí)行所有剩余的代碼語句。

3.再談可選參數(shù):

之前提過,可選參數(shù)允許我們對傳入?yún)?shù)提供默認值,如果調(diào)用者希望使用這些默認值而不是使用自定義數(shù)據(jù),就不必在單獨制定這些參數(shù)。盡管可選/命名參數(shù)靈巧的簡化了為給定類定義構(gòu)造函數(shù)集的方式,但是要記住的是這種語法只能在C#2010中編譯并且只能在.net4下運行(以及更高版本)。可選參數(shù)構(gòu)造函數(shù)諸如下面形式: public Motorcycle(int intensity = 0, string name = "") { //處理邏輯 }

static關鍵字:

C#類(或結(jié)構(gòu))可以通過static關鍵字來定義許多靜態(tài)成員。如果這樣的話,這些成員就只能直接從類級別而不是對象引用調(diào)用。比如Console中的WriteLine()方法。簡而言之,靜態(tài)方法被(類設計者)認為是非常普遍的項,并且不需要再調(diào)用成員時創(chuàng)建類型的實例。

1.定義靜態(tài)方法:

public static string A(){//處理邏輯};靜態(tài)成員只能操作靜態(tài)數(shù)據(jù)或者調(diào)用類的靜態(tài)方法,如果你常事在靜態(tài)成員中使用非靜態(tài)類數(shù)據(jù)或調(diào)用非靜態(tài)類方法,就會收到編譯時錯誤。

2.定義靜態(tài)數(shù)據(jù):

public static double currentNum=0.04;不同于非靜態(tài)數(shù)據(jù)那樣類型每個對象都會維護字段的一個獨立副本,靜態(tài)字段只在內(nèi)存中分配一次,之后所有的類型的對象操作的將會是同一個值。所以,要記住的是,靜態(tài)數(shù)據(jù)字段是所有對象共享的,因此如果你要定義一個所有對象都可以分享的數(shù)據(jù)點,就可以使用靜態(tài)成員。

3.定義靜態(tài)構(gòu)造函數(shù):

構(gòu)造函數(shù)用于在創(chuàng)建對象時設置對象的數(shù)據(jù)值,因此,如果在實例級別的構(gòu)造函數(shù)中賦值給靜態(tài)數(shù)據(jù)成員,你會驚奇的發(fā)現(xiàn)每次新建對象的時候,值都會重置。這種方法看起來違背了我們設計類的原則,但是如果需要在運行時獲取靜態(tài)數(shù)據(jù)的值的時候,將會非常有用。簡而言之,靜態(tài)構(gòu)造函數(shù)是特殊的構(gòu)造函數(shù),并且非常適用于初始化在編譯時未知的靜態(tài)數(shù)據(jù)的值。靜態(tài)構(gòu)造函數(shù)特點如下:
  1. 不能被重載。
  2. 不允許訪問修飾符也不能接受參數(shù)。
  3. 靜態(tài)構(gòu)造函數(shù)只執(zhí)行一次,不管創(chuàng)建多少類型的對象。
  4. 運行庫創(chuàng)建類實例或調(diào)用者首次訪問靜態(tài)成員之前,運行庫會調(diào)用靜態(tài)構(gòu)造函數(shù)。
  5. 靜態(tài)構(gòu)造函數(shù)執(zhí)行先于任何實例級別的構(gòu)造函數(shù)。

4.定義靜態(tài)類:

如果直接在類級別應用static關鍵字,就不能使用new關鍵字來創(chuàng)建,并且只能包含static關鍵字標記的成員或字段。說明:只包含靜態(tài)功能的類或結(jié)構(gòu)通常稱為工具類,在設計工具類時,將類定義為靜態(tài)類是一個非常好的做法。

OOP的支柱

oop支柱,也就是面向?qū)ο笳Z言的原則。封裝、繼承、多態(tài)。

1.封裝的作用:

封裝是將對象用戶不必了解的實現(xiàn)細節(jié)隱藏起來的一種語言能力。和封裝編程邏輯緊密相關的概念是數(shù)據(jù)保護。理想狀態(tài)下,對象的狀態(tài)數(shù)據(jù)應該使用private關鍵字來指定。這樣的話,外部世界就不能直接改變或獲取底層的值,這樣可以避免數(shù)據(jù)點被破壞。

2.繼承的作用:

繼承是指基于已有類定義來創(chuàng)建心累定義的語言能力。本質(zhì)上,通過繼承,子類可以繼承基類(父類)核心的功能,并擴展基類的行為。在oop中海油另一種形式的代碼重用:包含/委托模型(has-a關系)。這種重用的形式不是用來建立父類/子類關系的。它意味著一個類可以定義另一個類的成員變量,并向?qū)ο笥脩糸g接公開它的功能。

3.多態(tài)的作用:

多態(tài)表示的是語言以同一種方式處理相關對象的能力。準確的說,這個面向?qū)ο笳Z言的原則允許基類為所有的派生類定義一個成員集合(多態(tài)接口)。

C#訪問修飾符

C#的訪問修飾符主要有private、public、protected、internal、protected internal。作用如下表:而C#成員類型的可修飾及默認修飾符如下表:private、protected、protected internal訪問修飾符可以應用到嵌套類型上。嵌套類型是直接聲明在類或結(jié)構(gòu)作用域中的類型。而非嵌套類上只能用public、internal修飾符定義。

C#封裝服務(OOP第一個支柱)

封裝的核心概念是,對象的內(nèi)部數(shù)據(jù)不應該從對象實例直接訪問。如果調(diào)用者想改變對象的狀態(tài),就要使用訪問方法(getter)和修改方法(setter)。在C#中,封裝是通過private、public、protected、internal關鍵字在語法級別上體現(xiàn)的。封裝提供了一種保護狀態(tài)數(shù)據(jù)完整性的方法,與定義共有字段相比,應該定義更多的私有數(shù)據(jù)字段,這種字段可以由調(diào)用者間接地操作。定義私有字段的主要方式有以下兩種(黑盒編程):
  1. 定義一對傳統(tǒng)的訪問方法和修改方法。
  2. 定義一個.net屬性。

1.使用傳統(tǒng)的訪問方法和修改方法執(zhí)行封裝:

即用get方法和set方法。set方法可以改變當前實際狀態(tài)數(shù)據(jù)的值。定義如下:class A{ private string name; //get public string GetName() { return name; } //set public void SetName() { //處理邏輯 }}

2.使用.net屬性進行封裝:

盡管可以使用傳統(tǒng)的獲取方法和設置方法封裝這些字段數(shù)據(jù),.net語言還是提倡使用屬性來強制數(shù)據(jù)封裝狀態(tài)數(shù)據(jù)。C#屬性由屬性作用域中定義的get作用域(訪問方法)和set作用域(修改方法)構(gòu)成 ,屬性通過返回值指定了它所封裝的數(shù)據(jù)類型。定義如下:其中set中的value標記用來表示調(diào)用者設置屬性時傳入的值。private int id;public int ID{ get{return id;} set{id = value;}}屬性的好處主要是,讓我們類型易于操作,因為屬性可以結(jié)合C#內(nèi)部操作符進行使用。

3.使用類的屬性:

屬性,特別是屬性的set部分,常用語打包類的業(yè)務規(guī)則。在類中直接使用屬性更好一些,將會減少一些重復的檢查或者判斷。

4.屬性的內(nèi)部表示:

許多程序員往往使用get_和set_前綴來命名傳統(tǒng)的訪問方法和修改方法。這種命名約定沒有問題,但是在底層,C#屬性也是使用相同的前綴在CIL代碼中我們可以清晰的看到。可以用ildasm.exe打開exe程序觀看。說明,封裝字段數(shù)據(jù)時,.net基礎類庫總是使用類型屬性而不是傳統(tǒng)的訪問方法和修改方法,因此,如果想創(chuàng)建能與.net平臺良好集成的自定義類,就不要定義傳統(tǒng)的訪問方法和修改方法。以避免和類中定義的方法名字產(chǎn)生雷同而產(chǎn)生編譯錯誤。

5.控制屬性的get/set語句的可見性級別:

在一些情況下,為獲取和設置邏輯指定唯一的可訪問性級別是有益的。為此,我們可以將可訪問性關鍵字作為合適的get或set關鍵字的前綴:public string A{ get{return a;} protected set{a = value;}}

6.只讀和只寫屬性:

當封裝數(shù)據(jù)時,可能希望配置一個只讀屬性,為此,可以忽略set塊。如果想要只寫屬性,則是忽略get塊。這樣,如果一個只讀屬性被試圖賦值的時候,就會產(chǎn)生編譯錯誤。

7.靜態(tài)屬性:

C#還支持靜態(tài)屬性,靜態(tài)屬性必須在靜態(tài)數(shù)據(jù)上操作。C#喜歡用屬性來封裝數(shù)據(jù),屬性的優(yōu)點是,對象的用戶可以只使用一個命名項就能操作內(nèi)部數(shù)據(jù)。

自動屬性

public int A{get;set;}而自動屬性不允許創(chuàng)建只讀和只寫屬性,如public int A{get;}會產(chǎn)生編譯錯誤。

1.與自動屬性交互:

由于編譯器在編譯時才會定義私有的返回字段,所以定義自動屬性的類通常都需要使用屬性語法來獲取和設置實際的值。屬性語法:a.b="aa";

2.關于自動屬性和默認值:

你可以直接在代碼庫中使用封裝了數(shù)字或布爾數(shù)據(jù)的自動屬性,因為隱藏的返回字段將設置一個可以直接使用的安全默認值。但如果自動屬性包裝了另一個類變量,隱藏的私有引用類型的默認值也將設置為null。public int A {get; set;}//隱藏的int返回字段設置為0 public Car B{get;set;}//隱藏的Car返回字段設置為null;由于私有的返回字段是在編譯時創(chuàng)建的,所以你不能使用C#的字段初始化語法用new關鍵字直接分配引用類型,這項工作必須在類構(gòu)造函數(shù)內(nèi)部執(zhí)行,以確保對象以安全的方式誕生。class Car{ public int A{get;set;} public Car() { A=1; }}

對象初始化器語法

為了簡化新建對象的過程,C#提供了對象初始化器語法,語法組成為:大括號內(nèi)部用逗號分隔的指定值列表:Car car = new Car(){ petName="abc";}對象初始化語法只是使用默認構(gòu)造函數(shù)創(chuàng)建類變量并設置各個屬性狀態(tài)數(shù)據(jù)的語法的簡寫形式。

常量數(shù)據(jù)

const int a=100;C#通過const關鍵字來定義常量(它在賦初始值后從未變過)。而類的常量字段是隱式靜態(tài)的。然而,我們可以在類型成員中定義和訪問局部常量。注意,常量在定義時必須為其指定初始值。否
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 广丰县| 息烽县| 东乌珠穆沁旗| 砚山县| 合江县| 恩施市| 鄱阳县| 大关县| 锡林郭勒盟| 泗洪县| 高唐县| 徐闻县| 浦县| 通城县| 泊头市| 开原市| 安平县| 德令哈市| 区。| 社旗县| 郎溪县| 乌什县| 新泰市| 三台县| 仪征市| 岢岚县| 荔波县| 南阳市| 惠安县| 洪江市| 龙胜| 商水县| 柘荣县| 龙川县| 民勤县| 两当县| 靖安县| 横山县| 高淳县| 六安市| 泸州市|