C#物件導向基礎

來源:互聯網
上載者:User

C#物件導向基礎

1、 為什麼要有物件導向?

(1) 增加代碼重用。

(2)降低維護負擔,將具備獨特性質的代碼封裝起來,修改程式時,相互不會影響。

2、資料封裝用來解決全域變數不易維護的問題。

3、多態:為了加強繼承的彈性,常常需要子類對父類的方法進行重寫(函數名稱不變)。

4、抽象化是為了降低程式版本更新後的維護負擔。使功能的提供者和使用者分開,各自獨立,彼此不受影響。

5、為了抽達到象化,提供介面用於建立功能提供者和使用者之間的規範。功能提供者和使用者按照這個規範來提供、使用這些功能。這個功用的規範就是介面。介面中定義了常量、函數名稱、函數參數等。因此介面不改變的情況下,功能提供者就可以任意的改寫函數中的代碼,而不會影響到使用者使用這些功能。

 

抽象化的優點:

.可編寫函數處理有相同介面的類

例如:員工薪水的發放:按照職位、工齡發放,只需要定義一個計算薪水的介面,然後分別實現。

.用於未來功能的擴充。

.讓功能提供者和使用者相互獨立。

6、通常繼承應用在公司的內部開發上,以重複使用其他設計師編寫好的代碼;而介面多半是用於兩個部門或兩家以上的公司,用於分別開發自己的應用程式時建立的公用的規範。

7、類是資料封裝的基本單位。是重複使用的最小單位。

類的成員:變數、方法、屬性、事件、常數

對象是類在記憶體中的實體,類用於描述對象在記憶體中的資料。也就是說類用於定義對象的長相。

8、靜態方法可以不建立類的對象,即不用new執行個體化,而用類直接調用:類名.方法名()

Static變數通常用於配置全域共用的區塊

9、new執行個體化對象後,對象將會被配置在堆積Heap中,堆棧Stack內儲存的是指向堆積Heap中對象所在位置的參考指標。執行個體化的那個對象用於存放的是指標。執行個體化的對象是放在堆棧中的,如:

 

9、結構和類的區別:結構主要由簡單的數實值型別組合而成,配置在堆棧中。類屬於參考類型,配置在堆積中。結構不支援繼承。

10、資料封裝:使用類進行封裝。

封裝目的:資料和方法被封裝起來,通過方法存取資料。可以控制資料的存取方式。

11、存取修飾詞:

public:所有

private:類中的方法和成員只能在此類中使用,外部不能使用。

protected:類自身可以使用、子類也可以使用。protected並不是被衍生類別隨心所欲的訪問,訪問是有條件的:訪問必須是子類類型發生時,父類的protecte成員才能夠被訪問

internal:同一個.NET Assembly中可以使用

protected internal:只限定在目前的項目或繼承自此類的成員才可以使用

注意:在聲明方法是,預設識private

一個好的物件導向的設計,通常把所有的資料成員定義為private,然後提供方法來存取這些資料

12、資料封裝的目的:易於控制資料、容易修改。

13、靜態成員:

對象中的資料都是對象私人的,只有對象才能操作這些資料,其他對象不能操作。那麼有時候把所有對象共用的資料儲存在每一個對象中並不是很好,比如一個公司的所有員工同屬於這個公司,若在員工類中定義一個存放公司名稱的成員變數,那麼,在執行個體化對象後,都需要用:對象名.方法名() 來存取公司名稱資訊,這樣若公司名稱改變了,維護起來比較麻煩,並且電腦還要分配記憶體、硬碟空間等,為瞭解決這個問題,在實現的時候會將這種資料放在全域的記憶體區塊上,也就是說,這個資料不是對象能夠操作的,而是類層級的,對象操作不了。但是,全域的資料並不是儲存在類中的,因此,不能夠使用封裝的技巧使用全域變數,取而代之的是以靜態static的方式來描述這樣的資料。靜態類就是用來描述類中共用資訊的。

待用資料是在類中聲明的,所以能夠體現封裝的特性。就算這個定義了待用資料的類沒有被執行個體化,該待用資料還是存在的。所以,不用建立對象實體就可以對待用資料進行操作。

編譯器會在類載入是自動初始化static變數,也就是說,若靜態成員變數沒有被賦值,那麼在編譯時間,編譯器會自動給變數賦值。String類型是Null 字元串,int類型是0,bool類型是false,生命週期被限定在應用程式的生命週期中

14、靜態方法:

對待用資料進行操作需要使用靜態方法,靜態方法屬於類,是類層級的,不是對象能夠操作的,靜態方法不能用this保留字

通常,編譯器Compiler在編譯時間會將待用資料和靜態方法當做全域變數或全域函數來對待。預設的待用資料是private的

靜態方法不能夠存取非待用資料和非靜態方法。

windows應用程式中Main()方法定義為public static,不需要執行個體化Runtime就可以直接運行Main().靜態方法只能用類調用,非靜態方法用執行個體調用。

15、this運算元

this運算元是指向此對象的參考指標。也就是執行個體化後就可以使用this來存取這一對象實體。還可以用於解決名稱相同的問題:this.Name=Name(參數)。this還可以用來返回目前對象的參考: this.Name=Name ;return this。

16、類預設的存取修飾詞是private

17、internal修飾符是類型和類型成員的存取修飾詞。只有在同一個程式集的檔案中,內部類型或者是成員才可以訪問,Assembly:一個完整的.exe或者是.dll檔案就是一個程式集。

18、參考類型:

實實值型別:包含的是真正的資料,不能為null。堆棧。

參考類型:一個指向實際資料的參考指標。堆積。

 

封裝、繼承、多態

繼承:

1、C#語言提供兩種繼承的方式:實現繼承(只能單一繼承)和介面繼承(可以多繼承)

UML中

類名

Employee

成員變數

-CompanyName:string

-EmployeeID:int

-EmployeeName:string

-EmployeeSalary:string

方法

+SetID(in ID:String):void

+GetID():string

+SetCompanyName(in CompantName:String):void

 

 

 

成員變數:-CompanyName:string字串類型,“-”表示private存取修飾詞,成員變數下方 加底線表示static

方法:+SetID(in ID:String):void in 表示輸入參數 void表示不傳回值,有底線表示static

子類不能繼承父類的建構函式和解構函式。

繼承預設是public

2、Base:代表基類中調用父類的建構函式,注意,這個建構函式的的參數個數和類型必須和基類中某一個建構函式一樣。Base的另外用法是調用基類的成員(成員方法),如:

父類:

namespace ClassTest

{

public class Employ

{

public Employ(string EmployeeNum)

{

}

private string employeeNum;//員工編號

public void SetEmployeeID(string EmployeeNum) //設定員工編號

{

employeeNum = EmployeeNum;

}

}

}

子類:

namespace ClassTest

{

public class U_base:Employ

{

public U_base(string EmployeeNum)

: base(EmployeeNum) //base指基類中的建構函式,參數類型和個數必須相同

{

base.SetEmployeeID(EmployeeNum); //這裡的base是用於調用基類中的成員方法

}

}

}

3、基類重寫override父類方法,這是多態的一種表現形式,是對基類中的方法進行重新定義。方法名以及參數和基類中的相同,只是方法內部代碼不同。(重載是同一個類中的同一種方法的傳回值可以相同,也可以不同,是一個類中多態的一種表現,參數不同)

4、虛擬方法

體現多態。一個類中預設的方法都是非虛擬,不允許在同一個類中用相同的方法去實現不同的功能

虛擬方法不可以是靜態。因為靜態方法是類層級的,而多態只能體現在對象層級。

Virtual不能用private修飾,否則沒法再子類中重寫。

Virtual方法可以有具體的實現,而abstract方法不能有具體的實現,abstract方法必須在子類中用override來實現。

基類中的Virtual方法被子類中的override重寫是,方法的修飾符(不存在修飾符許可權大小問題,必須相同)、名稱、參數、傳回值必須相同。

Virtual和override不能同時使用,因為override方法是隱含virtual的。

override不能和private、static一起使用,因為靜態方法是類層級的,而多態只能體現在對象層級;override方法必須要改寫virtual方法,若設定為private就不能改了。

virtual用來修改基類的方法或屬性的定義部分。虛擬成員或虛擬函數可以在子類中改寫其功能。Virtual用於基類中。Virtual方法可以被執行個體化成員調用。

具體用法是在基類中定義virtual方法,然後根據需要在子類中重寫override功能,沒有用virtual聲明的方法不能用override重寫,否則出錯。

若基類和子類中有相同的方法,那麼基類的方法被子類覆蓋,基類能夠調用自己的該方法,子類調用的該方法是子類自己的該方法。

注意:不管是基類中的virtual還是子類中的override方法,都能被各自的類調用。

5、final最終類不允許繼承,裡面的方法不允許override

6、new關鍵字

在子類中定義方法用以取代基類中的方法,但是基類中的該方法還是能夠被基類的執行個體調用,而不能被子類執行個體使用了。子類中用new修飾的方法只能用子類的執行個體調用。使用new和在子類中直接定義一個和基類中的方法相同的方法的效果是一樣的,不過這樣會有警告。

7、sealed類(例如enum、String)和sealed方法

Sealed類防止類被繼承,也就是說sealed類不能作為基類。Sealed方法不能被override重寫

8、C#中允許將基類的類型指標指向子類:B:A{…} A a=new A();B b=new B();A c=b;這裡的c是A的執行個體,若c.方法名(),則調用的是A中的方法。當然,若A中有virtual方法,那麼A c=b就會先調用A,然後發現A中的方法用virtual修飾,會進一步檢測B中的方法,若B類中的方法被virtual修飾,則A、B中的方法不相關,若B中的方法用new修飾,表明這是一個新的方法,,最終調用的是還是A中的方法。若B中的方法用override修飾,表明這是一個新的方法,,最終調用的是還是B中的方法。

9、介面

為了達到抽象化,需要在功能的定義和使用之間提供一種公用的規範,以便提供者和使用者都能夠按照規範進行操作。這樣的規範就是介面。介面只是定義了規範,沒有具體的實現(抽象類別可以有具體的實現),介面支援多繼承,類支援單繼承。介面中定義的方法不能包含區塊內容,也就是說不應該有大括弧:public interface Job{double C(){}};這是錯誤的,定義在介面中的方法隱含都是public,若定義的時候再加上public就會報錯啊。類一旦繼承了介面,就應該實現介面中的所有方法,而且實現時要和介面中該方法完全相同(修飾符、傳回值、方法名稱、參數),繼承自介面的方法可以用virtual關鍵字修飾,用於自他類繼承。但是介面中的方法不能用virtual,也不能有修飾符。

10、抽象類別、抽象方法

抽象類別和介面一樣不能執行個體化。抽象方法隱含是virtual的,所以不能和virtual連用。抽象方法只能定義在抽象類別中。抽象方法只能由定義部分,不能有大括弧,抽象方法一定要在子類中實現。和介面類似,抽象方法和virtual修飾的方法的區別是virtual可以有實現部分,即大括弧。抽象類別可以繼承自非抽象類別、抽象類別。

抽象類別和介面都不能使用sealed修飾,介面中不能包含抽象方法,抽象方法中可以使用ovreride、new修飾符

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.