您現在的位置是:首頁 > 武術

「c 技術」第7章 面向物件的程式設計

  • 由 陽仔聊技術 發表于 武術
  • 2022-03-11
簡介本章要點:面向物件的基本概念類的定義與物件的宣告建構函式和解構函式類的靜態成員和例項成員方法過載及運算子過載的程式設計實現類的繼承與多型性的程式設計實現類的屬性的實現7

壓棧sp怎麼變

「c 技術」第7章 面向物件的程式設計

本章要點:

面向物件的基本概念

類的定義與物件的宣告

建構函式和解構函式

類的靜態成員和例項成員

方法過載及運算子過載的程式設計實現

類的繼承與多型性的程式設計實現

類的屬性的實現

7。1 循序漸進學理論

7。1。1 面向物件程式設計概述

1.面向物件程式設計的由來

面向物件的程式設計是一種基於結構分析的、以資料為中心的程式設計方法。面向物件的程式設計方法總體思路是:將資料及處理這些資料的操作都封裝(Encapsulation)到一個稱為類(Class)的資料結構中,在程式中使用的是類的例項——物件。物件是程式碼與資料的集合,是封裝好了的一個整體,物件具有一定的功能。也就是說物件是具有一定功能的程式實體。程式是由一個個物件構成的,物件之間透過一定的“相互操作”傳遞訊息,在訊息的作用下,完成特定的功能。

2.面向物件程式設計的基本概念

(1)類和物件

通常把具有同樣性質和功能的東西所構成的集合叫作類。

(2)屬性、方法與事件

屬性是物件的狀態和特點。

方法是物件能夠執行的一些操作,它體現了物件的功能。

事件是物件能夠識別和響應的某些操作。

(3)封裝

所謂的封裝,就是將用來描述客觀事物的一組資料和操作組裝在一起,形成一個類。

(4)繼承

類之間除了有相互交流或訪問的關係以外,還可能存在著一種特殊的關係,這就是繼承。在VisualC#中只支援單繼承,即一個派生類只能有一個基類。

(5)過載

過載指的是方法名稱一樣,但如果引數不同,就會有不同的具體實現。過載主要有兩類:方法過載及運算子過載。

(6)多型性

所謂多型性就是在程式執行時,面向物件的語言會自動判斷物件的派生型別,並呼叫相應的方法。

7。1。2 類和物件的宣告

1.類的宣告

[格式]:[類修飾符]class 類名[:基類類名]

{

成員定義列表;

}

【例7-1】定義一個Student類,用來對學生的資訊和功能進行描述。假設學生具有學號、姓名、年齡、性別、平均成績等特徵,並且具有設定學生特徵和顯示學生特徵的功能。

2.物件的宣告

[格式]:類名 例項名=new類名([引數]);3.類的成員

(1)類成員的分類

類的具體成員如下。

常量:用來定義與類相關的常量值。

欄位:類中的變數,相當於C++中的成員變數。

型別:用來定義只能在類中使用的區域性型別。

方法:完成類中各種計算或功能的操作。

屬性:定義類的特徵,並對它們提供讀、寫操作。

事件:由類產生的通知,用於說明發生了什麼事情。

索引器:允許程式設計人員在訪問陣列時,透過索引器訪問類的多個例項。又稱下標指示器。

運算子:定義類的例項能使用的運算子。

建構函式:在類被例項化時首先執行的函式,主要是完成物件初始化操作。

解構函式:在物件被銷燬之前最後執行的函式,主要是完成物件結束時的收尾操作。

(2)類成員的可訪問性

在編寫程式時,可以對類的成員使用不同的訪問修飾符,從而定義它們的訪問級別,即類成員的可訪問性(Accessibility)。

在C#中,根據類成員的可訪問性可以把類成員分成四類,分別是公有成員(public)、私有成員(private)、保護成員(protected)、內部成員(internal)。

(3)類的靜態成員和例項成員

類的成員又可以分成靜態成員和非靜態成員。在宣告成員時,如果在語句前加上static保留字,則該成員是靜態成員,如果沒有static保留字,則成員是非靜態成員。二者最重要的區別是:靜態成員屬於類所有,非靜態成員屬於類的例項所有,所以又稱例項成員。

7。1。3 類的建構函式和解構函式

1.建構函式

建構函式主要用來為物件分配儲存空間,完成初始化操作(如給類的成員變數賦值等)。在C#中,類的建構函式遵循以下規定。

(1)建構函式的函式名和類的名稱一樣。

(2)當某個類沒有建構函式時,系統將自動為其建立建構函式,這種建構函式稱為預設建構函式。如例7-2中預設的建構函式為:

Example1()

{

};

(3)建構函式的訪問修飾符總是public。如果是private,則表示這個類不能被例項化,這通常用於只含有靜態成員的類中。

(4)建構函式由於不需要顯式呼叫,因而不用宣告返回型別。

(5)建構函式可以帶引數也可以不帶引數。

2.解構函式

解構函式在物件銷燬時被呼叫,常用來釋放物件佔用的儲存空間。解構函式具有以下特點。

(1)解構函式不能帶有引數。

(2)解構函式不能擁有訪問修飾符。

(3)不能顯式地呼叫解構函式。

(4)解構函式的命名規則是在類名前加上一個“~”號。如上例的Example1類的解構函式為:

~Example1()

{

};

(5)解構函式在物件銷燬時自動呼叫。

【例7-3】 類的建構函式和解構函式的演示。(程式程式碼詳見例7-3)[執行結果]

「c 技術」第7章 面向物件的程式設計

7。1。4 類的方法及方法的過載

1.方法的定義

[格式]:[方法修飾符] 返回值型別 方法名([引數列表])

{ 方法實現部分;

}

2.靜態方法和非靜態方法

對於靜態方法和非靜態方法,只需抓住以下幾點:(1)靜態方法屬於類所有,非靜態方法屬於類定義的物件所有;(2)非靜態方法可以訪問類中包括靜態成員在內的所有成員,而靜態方法只能訪問類中的靜態成員。

【例7-4】 靜態方法和動態方法的演示。請觀察並分析下列程式的執行結果。(程式程式碼詳見例7-4)

[執行結果]

「c 技術」第7章 面向物件的程式設計

3.引數陣列

關於引數陣列,需掌握以下幾點。

(1)若形參表中含一個引數陣列,則該引數陣列必須位於形參列表的最後;

(2)引數陣列必須是一維陣列;

(3)不允許將params修飾符與ref和out修飾符組合起來使用;

(4)與引數陣列對應的實參可以是同一型別的陣列名,也可以是任意多個與該陣列的元素屬於同一型別的變數;

(5)若實參是陣列則按引用傳遞,若實參是變數或表示式則按值傳遞。

【例7-5】 引數陣列的演示。請觀察並分析下列程式的執行結果。(程式程式碼詳見例7-5)

[執行結果]

「c 技術」第7章 面向物件的程式設計

4.方法的過載

方法過載是指同樣的一個方法名,有多種不同的實現方法。方法過載的格式是在一個類中兩次或多次定義同名的方法,這些同名的方法包括從基類繼承而來的方法,這些方法名稱相同,但每個方法的引數型別或個數不同,從而便於在使用者呼叫方法時系統能夠自動識別應呼叫的方法。

【例7-6】 方法過載的演示。請觀察並分析下列程式的執行結果。(程式程式碼詳見例7-6)

[執行結果]

「c 技術」第7章 面向物件的程式設計

7。1。5 運算子過載

在C#中,運算子過載在類中進行宣告,宣告的格式如下。

[格式]:返回值型別 operator 運算子(運算物件列表)

{

過載的實現部分;

};

在C#中,可以過載的運算子主要有:

+ - ! ~ ++ —— true false

* / % & | ^ << >> == != < > <= >=

不能過載的運算子有: .

= && || ?: new typeof sizeof is

【例7-7】 運算子過載的演示。請觀察並分析下列程式的執行結果。(程式程式碼詳見例7-7)

[執行結果]

「c 技術」第7章 面向物件的程式設計

7。1。6 域與屬性

1.域

域又稱欄位,它是類的一個成員,這個成員代表與物件或類相關的變數。域的定義格式如下。

[格式]:[域修飾符] 域型別 域名;

【例7-8】 域的演示。請觀察並分析下列程式的執行結果。(程式程式碼詳見例7-8)

[執行結果]

「c 技術」第7章 面向物件的程式設計

2.屬性

屬性是對現實世界中實體特徵的抽象,它提供了一種對類或物件特性進行訪問的機制。屬性的宣告格式如下。

[格式]:[屬性修飾符] 型別說明符 屬性名 {訪問宣告}【例7-9】 屬性的演示。請觀察並分析下列程式的執行結果。(程式程式碼詳見例7-9)

[執行結果]

7。1。7 this關鍵字

this關鍵字用來引用類的當前例項,成員透過this關鍵字可以知道自己屬於哪一個例項。this關鍵字只能用在類的建構函式、類的例項方法中,在其它地方(如靜態方法中)使用this關鍵字均是錯誤的。

7。1。8 類的繼承

繼承是面向物件程式設計中實現程式碼重用的重要機制之一,它起源於現實世界中事物之間的聯絡。

類的繼承的基本格式與功能如下。

[格式]:

class 派生類類名:基類類名

{ 成員宣告列表;

}

【例7-10】 類繼承的演示。請觀察並分析下列程式的執行結果。(程式程式碼詳見例7-10)

[執行結果]

「c 技術」第7章 面向物件的程式設計

7。1。9 多型性

多型性是指同一操作作用於不同類的例項,這些類對它進行不同的解釋,從而產生不同的執行結果的現象。在C#中有兩種多型性:編譯時的多型性和執行時的多型性。

執行時的多型性是透過繼承和虛成員來實現的。執行時的多型性是指系統在編譯時不確定選用哪個過載方法,而是直到程式執行時,才根據實際情況決定採用哪個過載方法。

編譯時的多型性具有執行速度快的特點,而執行時的多型性則具有極大的靈活性。

【例7-11】 虛擬函式與多型性的演示。請觀察並分析下列程式的執行結果。(程式程式碼詳見例7-11)

[執行結果]

「c 技術」第7章 面向物件的程式設計

7。1。10 密封類與抽象類

把一個類宣告為密封類的原因是為了防止該類被其它類繼承,密封類的宣告方法是在類名前加上sealed修飾符。

抽象類表示一種抽象的概念,一般用於為派生類提供公共介面。在宣告類時,在類名前有abstract修飾符則表示該類為抽象類。抽象類只能作為其他類的基類,不能被例項化,在抽象類中可以包含抽象方法和抽象訪問器。

7。2 典型例項練能力

7。2。1 典型例項一:Time類的建立與演示【例項題目】

編寫一個名為Time1的類,該類能夠存放時間資訊,並且具有設定時間和顯示時間的功能。然後程式設計對該類進行測試。測試介面如圖7-1所示。

「c 技術」第7章 面向物件的程式設計

7。2。2 典型例項二:複數“*”運算及複數值設定的實現

【例項題目】

編寫一個複數類,該複數類具有以下功能:(1)乘法運算的功能。如a和b分別是該複數類的兩個例項,則可以進行a*b的運算,運算結果是一個複數,該複數是複數a和複數b的乘積。(2)對複數值進行設定的功能,有兩種設定方法,分別對複數的實部(虛部為0)進行設定、對複數的實部和虛部同時進行設定。然後程式設計進行驗證。驗證介面如圖7-2所示。

「c 技術」第7章 面向物件的程式設計

7。3 上機練習重應用

7。3。1 上機練習一:棧模型的實現

【練習題目】

棧是一種重要的資料結構,在記憶體中佔用連續的儲存單元。棧有兩個端點,固定的棧底和浮動的棧頂。為指示棧頂位置還應設一個指示成員變數(稱為棧頂指示器)。棧有兩種基本操作:push(壓棧)和pop(出棧),壓棧是向棧頂位置寫入一個元素,然後使棧頂指示器加1,出棧是先使棧頂指示器減1,再把該位置的元素讀出來。棧及其操作模型如圖7-3所示,sp代表棧頂指示器。請程式設計實現棧的模型並對之進行測試,測試的介面如圖7-4所示。

「c 技術」第7章 面向物件的程式設計

「c 技術」第7章 面向物件的程式設計

7。3。2 上機練習二:從shape類派生出Rectangle、Circle等具體形狀類

【練習題目】

定義一個shape抽象類,利用它作為基類派生出Rectangle、Circle等具體形狀類,已知具體形狀類均具有兩個方法GetArea和GetPerim,分別用來求形狀的面積和周長。最後編寫一個測試程式對產生的類的功能進行驗證,驗證程式的執行介面如圖7-5所示。

「c 技術」第7章 面向物件的程式設計

Top