《C#程序設(shè)計課件》(資料全集)c#課件_第1頁
《C#程序設(shè)計課件》(資料全集)c#課件_第2頁
《C#程序設(shè)計課件》(資料全集)c#課件_第3頁
《C#程序設(shè)計課件》(資料全集)c#課件_第4頁
《C#程序設(shè)計課件》(資料全集)c#課件_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、C#程序設(shè)計課件(資料全集)c#1第六章第六章 面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計C#.net程序設(shè)計C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#本章主要內(nèi)容本章主要內(nèi)容l對象、類和結(jié)構(gòu)對象、類和結(jié)構(gòu)l方法,方法的參數(shù)(值類型,引用類型,參方法,方法的參數(shù)(值類型,引用類型,參數(shù)數(shù)組數(shù)數(shù)組params)l靜態(tài)類與靜態(tài)成員靜態(tài)類與靜態(tài)成員l屬性與索引器屬性與索引器l繼承(多態(tài)性,繼承(多態(tài)性,new,Virtual和和Override關(guān)關(guān)鍵字),接口繼承鍵字),接口繼承l(wèi)abstract抽象類和類成員和抽象類和類成員和sealed密封類和密封類和類成員類成員l重載運(yùn)算符重載運(yùn)算符l使用使用

2、Visual Studio類關(guān)系圖可視化創(chuàng)建對象類關(guān)系圖可視化創(chuàng)建對象C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#對象、類和結(jié)構(gòu)概述對象、類和結(jié)構(gòu)概述對象、類和結(jié)構(gòu)具有以下特點:對象、類和結(jié)構(gòu)具有以下特點:l新數(shù)據(jù)類型是使用類和結(jié)構(gòu)定義的。新數(shù)據(jù)類型是使用類和結(jié)構(gòu)定義的。l對象是給定數(shù)據(jù)類型(類和結(jié)構(gòu))的實例。對象是給定數(shù)據(jù)類型(類和結(jié)構(gòu))的實例。在執(zhí)行應(yīng)用程序時,數(shù)據(jù)類型為創(chuàng)建對象在執(zhí)行應(yīng)用程序時,數(shù)據(jù)類型為創(chuàng)建對象(或?qū)嵗┨峁┧{(lán)圖。(或?qū)嵗┨峁┧{(lán)圖。lC# 應(yīng)用程序始終包含至少一個類。應(yīng)用程序始終包含至少一個類。l結(jié)構(gòu)可視為輕量類,是創(chuàng)建用于存儲少量數(shù)結(jié)構(gòu)可視為輕量類,是創(chuàng)

3、建用于存儲少量數(shù)據(jù)的數(shù)據(jù)類型的理想選擇,不能通過繼承進(jìn)據(jù)的數(shù)據(jù)類型的理想選擇,不能通過繼承進(jìn)行擴(kuò)展的類型。行擴(kuò)展的類型。l類支持繼承,這意味著它們可以從先前定義類支持繼承,這意味著它們可以從先前定義的類中派生。的類中派生。l典型的典型的 C# 應(yīng)用程序由自定義的類和應(yīng)用程序由自定義的類和 .NET框框架架 的類組成。類是的類組成。類是 C# 中功能最為強(qiáng)大的數(shù)中功能最為強(qiáng)大的數(shù)據(jù)類型。類定義了數(shù)據(jù)類型的數(shù)據(jù)和行為。據(jù)類型。類定義了數(shù)據(jù)類型的數(shù)據(jù)和行為。對象、類和結(jié)構(gòu)對象、類和結(jié)構(gòu)C#程序設(shè)計課件(資料全集)c#結(jié)構(gòu)結(jié)構(gòu)(struct)l結(jié)構(gòu)與類一樣都具有表示其數(shù)據(jù)和行為的成員。這些成員包括:結(jié)

4、構(gòu)與類一樣都具有表示其數(shù)據(jù)和行為的成員。這些成員包括:字段,屬性,方法,事件,運(yùn)算符,索引器,構(gòu)造函數(shù),析構(gòu)函字段,屬性,方法,事件,運(yùn)算符,索引器,構(gòu)造函數(shù),析構(gòu)函數(shù)和嵌套類型。結(jié)構(gòu)與類共享幾乎所有相同的語法,但結(jié)構(gòu)比類數(shù)和嵌套類型。結(jié)構(gòu)與類共享幾乎所有相同的語法,但結(jié)構(gòu)比類受到的限制更多。結(jié)構(gòu)有以下特點:受到的限制更多。結(jié)構(gòu)有以下特點: l結(jié)構(gòu)是值類型,而類是引用類型。如果從結(jié)構(gòu)創(chuàng)建一個對象并將結(jié)構(gòu)是值類型,而類是引用類型。如果從結(jié)構(gòu)創(chuàng)建一個對象并將該對象賦給某個變量,變量則包含結(jié)構(gòu)的全部值。復(fù)制包含結(jié)構(gòu)該對象賦給某個變量,變量則包含結(jié)構(gòu)的全部值。復(fù)制包含結(jié)構(gòu)的變量時,將復(fù)制所有數(shù)據(jù),對新

5、副本所做的任何修改都不會改的變量時,將復(fù)制所有數(shù)據(jù),對新副本所做的任何修改都不會改變舊副本的數(shù)據(jù)。變舊副本的數(shù)據(jù)。l盡管結(jié)構(gòu)的靜態(tài)字段可以初始化,結(jié)構(gòu)實例字段聲明還是不能使盡管結(jié)構(gòu)的靜態(tài)字段可以初始化,結(jié)構(gòu)實例字段聲明還是不能使用初始值設(shè)定項。用初始值設(shè)定項。l結(jié)構(gòu)不能聲明默認(rèn)構(gòu)造函數(shù)(沒有參數(shù)的構(gòu)造函數(shù))或析構(gòu)函數(shù)。結(jié)構(gòu)不能聲明默認(rèn)構(gòu)造函數(shù)(沒有參數(shù)的構(gòu)造函數(shù))或析構(gòu)函數(shù)。l與類不同,結(jié)構(gòu)的實例化可以不使用與類不同,結(jié)構(gòu)的實例化可以不使用 new 運(yùn)算符。運(yùn)算符。l一個結(jié)構(gòu)不能從另一個結(jié)構(gòu)或類繼承,而且不能作為一個類的基。一個結(jié)構(gòu)不能從另一個結(jié)構(gòu)或類繼承,而且不能作為一個類的基。所有結(jié)構(gòu)都直

6、接繼承自所有結(jié)構(gòu)都直接繼承自 System.ValueType,后者繼承自,后者繼承自 System.Object。l結(jié)構(gòu)可以實現(xiàn)接口。結(jié)構(gòu)可以實現(xiàn)接口。l由于結(jié)構(gòu)不使用引用,因此結(jié)構(gòu)沒有標(biāo)識,具有相同數(shù)據(jù)的兩個由于結(jié)構(gòu)不使用引用,因此結(jié)構(gòu)沒有標(biāo)識,具有相同數(shù)據(jù)的兩個值類型實例是無法區(qū)分的。值類型實例是無法區(qū)分的。 對象、類和結(jié)構(gòu)對象、類和結(jié)構(gòu)C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#對象對象l對象指的是一個實體的實例,在這個實體中包括了特定的屬性數(shù)據(jù)和對這些數(shù)據(jù)進(jìn)行操作的方法。l對象具有以下特點:lC# 中使用的全都是對象,包括 Windows 窗體和控件。l對象是實例化的;也就是

7、說,對象是從類和結(jié)構(gòu)所定義的模板中創(chuàng)建的。l對象使用屬性獲取和更改它們所包含的信息。l對象通常具有允許它們執(zhí)行操作的方法和事件。lVisual Studio 提供了操作對象的工具:使用“屬性”窗口可以更改對象(如 Windows 窗體)的屬性。使用對象瀏覽器可以檢查對象的內(nèi)容。l所有 C# 對象都繼承自object。對象、類和結(jié)構(gòu)對象、類和結(jié)構(gòu)C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#類聲明類聲明l類是使用類是使用class關(guān)鍵字來定義的,類聲明語句定義一個關(guān)鍵字來定義的,類聲明語句定義一個新類,其語法格式為:新類,其語法格式為:l特征特征 修飾符修飾符 class 類名類名 :基類

8、名和任何實現(xiàn)接口的基類名和任何實現(xiàn)接口的列表列表類體類體l類的主要修飾符有以下幾種之一。類的主要修飾符有以下幾種之一。lpublic 表示不限制對該類的訪問表示不限制對該類的訪問lprotected 表示只能從所在類和所在類派生的子類進(jìn)表示只能從所在類和所在類派生的子類進(jìn)行訪問行訪問lprivate只有其所在類才能訪問只有其所在類才能訪問labstract 抽象類不允許建立類的實例抽象類不允許建立類的實例linternal 只有在同一程序集只有在同一程序集(.exe 或或 .dll )的文件中的類的文件中的類型或成員才可訪問的型或成員才可訪問的lpartial 表示將表示將類類的定義拆分到兩個

9、或多個源文件中的定義拆分到兩個或多個源文件中l(wèi)默認(rèn)情況下,在命名空間中或在編譯單元頂部(例如,默認(rèn)情況下,在命名空間中或在編譯單元頂部(例如,不在命名空間、類或結(jié)構(gòu)中)聲明的任何類型都是不在命名空間、類或結(jié)構(gòu)中)聲明的任何類型都是internal。l下面是聲明類下面是聲明類Shape的代碼:的代碼:對象、類和結(jié)構(gòu)對象、類和結(jié)構(gòu)C#程序設(shè)計課件(資料全集)c#abstract class Shape/抽象基類,不可實例化public const double pi = System.Math.PI;/常量protected double x, y;/受保護(hù),可繼承變量public Shape()

10、/默認(rèn)構(gòu)造函數(shù)x=y=0;public Shape(double x,double y) /帶參數(shù)構(gòu)造函數(shù)this.x = x;this.y = y;public abstract double Area(); /抽象方法,需重載在該例中 abstract class Shape類定義使用了修飾符abstract,這表示該類是抽象基類,不可實例化。類的名稱位于 class 關(guān)鍵字的后面,就是Shape。Shape類定義的其余部分是類的主體,用于定義行為和數(shù)據(jù)。類的字段、屬性、方法和事件統(tǒng)稱為“類成員”。C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#分部類定義分部類定義可以將可以將類類、結(jié)

11、構(gòu)結(jié)構(gòu)或或接口接口的定義拆分到兩個或多個源的定義拆分到兩個或多個源文件中。每個源文件包含類定義的一部分,編譯應(yīng)用程序文件中。每個源文件包含類定義的一部分,編譯應(yīng)用程序時將把所有部分組合起來。拆分類定義,使用時將把所有部分組合起來。拆分類定義,使用 partial 關(guān)關(guān)鍵字修飾符,鍵字修飾符,partial 修飾符只能出現(xiàn)在緊靠關(guān)鍵字修飾符只能出現(xiàn)在緊靠關(guān)鍵字 class、struct 或或 interface 前面的位置。如下例所示。前面的位置。如下例所示。Visual Studio 在創(chuàng)建在創(chuàng)建 Windows 窗體使用此分部定義方法,例如:窗體使用此分部定義方法,例如:下面在下面在form

12、1.cs和和Form1.Designer.cs代碼文件中使用分代碼文件中使用分部定義共同定義類部定義共同定義類Form1。其中。其中Form1.Designer.cs是窗是窗體設(shè)計器自動生成的源代碼,而體設(shè)計器自動生成的源代碼,而form1.cs是手工編程代碼是手工編程代碼的文件。的文件。public partial class Form1 : Form /form1.cs 文件文件partial class Form1 /Form1.Designer.cs對象、類和結(jié)構(gòu)對象、類和結(jié)構(gòu)C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#類繼承定義類繼承定義l繼承是類的重要特性。類可以從其他類中

13、繼承。在聲明類時,繼承是類的重要特性。類可以從其他類中繼承。在聲明類時,在類名稱后放置一個冒號,然后在冒號后指定要從中繼承的類在類名稱后放置一個冒號,然后在冒號后指定要從中繼承的類(即基類)。例如定義一個繼承了(即基類)。例如定義一個繼承了Shape類的類的Ellipse類:類:class Ellipse : Shape public Ellipse(double x, double y) : base(x, y) /使用基使用基類類Shape的構(gòu)造函數(shù)的構(gòu)造函數(shù) public override double Area()/函數(shù)重載函數(shù)重載 return pi * x * y; l使用繼承定義

14、的類稱為用派生類,派生類的成員包括基類的所使用繼承定義的類稱為用派生類,派生類的成員包括基類的所有非私有數(shù)據(jù)和行為以及派生類為自己定義的其他數(shù)據(jù)或行為。有非私有數(shù)據(jù)和行為以及派生類為自己定義的其他數(shù)據(jù)或行為。派生類將無法繼承基類私有的成員。例如:派生類派生類將無法繼承基類私有的成員。例如:派生類Ellipse繼承繼承基類基類Shape的公有的常量的公有的常量pi和受保護(hù)的字段和受保護(hù)的字段x,y。對象、類和結(jié)構(gòu)對象、類和結(jié)構(gòu)C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#字段字段l類的字段存儲類要滿足其設(shè)計所需要的數(shù)據(jù)。聲明字類的字段存儲類要滿足其設(shè)計所需要的數(shù)據(jù)。聲明字段時可以使用賦值運(yùn)

15、算符為字段指定一個初始值。字段時可以使用賦值運(yùn)算符為字段指定一個初始值。字段恰好在創(chuàng)建對象實例調(diào)用構(gòu)造函數(shù)之前初始化。字段恰好在創(chuàng)建對象實例調(diào)用構(gòu)造函數(shù)之前初始化。字段初始值設(shè)定項不能引用其他實例字段。段初始值設(shè)定項不能引用其他實例字段。l字段可標(biāo)記為字段可標(biāo)記為public、private、protected、internal。這些修飾符定義類的使用者訪問字段的方式??梢赃x這些修飾符定義類的使用者訪問字段的方式??梢赃x擇將字段聲明為擇將字段聲明為static靜態(tài),這使得在沒有創(chuàng)建實例能靜態(tài),這使得在沒有創(chuàng)建實例能調(diào)用靜態(tài)字段。調(diào)用靜態(tài)字段。l常數(shù)被聲明為字段,聲明時在字段的類型前面使用常數(shù)被

16、聲明為字段,聲明時在字段的類型前面使用const關(guān)鍵字。常數(shù)必須在聲明時初始化。例如:關(guān)鍵字。常數(shù)必須在聲明時初始化。例如:public const double pi = System.Math.PI;l只讀字段將字段聲明為只讀字段將字段聲明為readonly。只讀字段只能在初。只讀字段只能在初始化期間或在構(gòu)造函數(shù)中賦值。始化期間或在構(gòu)造函數(shù)中賦值。l為了簡單起見,下面示例使用為了簡單起見,下面示例使用public字段,這樣可以字段,這樣可以直接獲取或設(shè)置字段值,但是不建議這樣做。字段通直接獲取或設(shè)置字段值,但是不建議這樣做。字段通常應(yīng)為常應(yīng)為private。外部類應(yīng)當(dāng)通過方法、屬性或索引器

17、。外部類應(yīng)當(dāng)通過方法、屬性或索引器來間接訪問字段。例如來間接訪問字段。例如:對象、類和結(jié)構(gòu)對象、類和結(jié)構(gòu)C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#字段字段public class Point public double x, y; /聲明字段聲明字段 public double z = 0; /聲明字段具有初始值。聲明字段具有初始值。 public readonly string name = Point; /聲明具聲明具有初始值只讀字段。有初始值只讀字段。 public Point(double x, double y) /構(gòu)造函數(shù)用于構(gòu)造函數(shù)用于初始化字段。初始化字段。 this

18、.x = x; this.y = y; name = string.Format(0(1,2,3), name, x, y,z); public Point():this(0, 0)/調(diào)用其他構(gòu)造函數(shù)調(diào)用其他構(gòu)造函數(shù)對象、類和結(jié)構(gòu)對象、類和結(jié)構(gòu)C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#構(gòu)造函數(shù)構(gòu)造函數(shù)構(gòu)造函數(shù)是在創(chuàng)建給定類型的對象時執(zhí)行的構(gòu)造函數(shù)是在創(chuàng)建給定類型的對象時執(zhí)行的類類的方法。構(gòu)造的方法。構(gòu)造函數(shù)具有與類或結(jié)構(gòu)相同的名稱,它通常用于初始化新對象的數(shù)據(jù)成函數(shù)具有與類或結(jié)構(gòu)相同的名稱,它通常用于初始化新對象的數(shù)據(jù)成員。只要創(chuàng)建員。只要創(chuàng)建類類或或結(jié)構(gòu)結(jié)構(gòu),就會調(diào)用它的構(gòu)造函數(shù)。

19、類或結(jié)構(gòu)可能有多,就會調(diào)用它的構(gòu)造函數(shù)。類或結(jié)構(gòu)可能有多個接受不同參數(shù)的構(gòu)造函數(shù)。在上面的示例中,定義了一個具有一個個接受不同參數(shù)的構(gòu)造函數(shù)。在上面的示例中,定義了一個具有一個簡單的構(gòu)造函數(shù)名為簡單的構(gòu)造函數(shù)名為Point的類。的類。類定義對象的類型,但它不是對象本身。對象是基于類的具類定義對象的類型,但它不是對象本身。對象是基于類的具體實體,有時稱為類的實例。體實體,有時稱為類的實例。通過使用通過使用 new 關(guān)鍵字,后跟類的構(gòu)造函數(shù),可以創(chuàng)建對象,關(guān)鍵字,后跟類的構(gòu)造函數(shù),可以創(chuàng)建對象,在為新對象分配內(nèi)存之后,在為新對象分配內(nèi)存之后,new 運(yùn)算符立即調(diào)用構(gòu)造函數(shù)。運(yùn)算符立即調(diào)用構(gòu)造函數(shù)。

20、下面的下面的TestPoint類類Main()中使用中使用 new 運(yùn)算符創(chuàng)建對象來實運(yùn)算符創(chuàng)建對象來實例化例化Point類:類:class TestPoint static void Main() Point p = new Point(1.0, 3.0);/創(chuàng)建創(chuàng)建Point對象實例對象實例p p.z = 1;/Point對象實例對象實例p的的z字段賦值字段賦值 Console.WriteLine(x,y,z)=0,1,2,3,p.x,p.y,p.); 對象、類和結(jié)構(gòu)對象、類和結(jié)構(gòu)C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#構(gòu)造函數(shù)構(gòu)造函數(shù)l不帶參數(shù)的構(gòu)造函數(shù)稱為不帶參數(shù)的構(gòu)造函數(shù)

21、稱為“默認(rèn)構(gòu)造函數(shù)默認(rèn)構(gòu)造函數(shù)”。當(dāng)類沒有構(gòu)造函數(shù),。當(dāng)類沒有構(gòu)造函數(shù),系統(tǒng)自動生成一個構(gòu)造函數(shù),并且將用默認(rèn)值來初始化對象字段,系統(tǒng)自動生成一個構(gòu)造函數(shù),并且將用默認(rèn)值來初始化對象字段,有關(guān)默認(rèn)值參見表有關(guān)默認(rèn)值參見表2.1。l構(gòu)造函數(shù)可以使用構(gòu)造函數(shù)可以使用 this 關(guān)鍵字調(diào)用同一類中的另一構(gòu)造函數(shù)。如關(guān)鍵字調(diào)用同一類中的另一構(gòu)造函數(shù)。如public Point():this(0, 0)/調(diào)用其他構(gòu)造函數(shù)調(diào)用其他構(gòu)造函數(shù)l基類的構(gòu)造函數(shù)將在其派生類構(gòu)造函數(shù)調(diào)用前調(diào)用,使基類的構(gòu)造函數(shù)將在其派生類構(gòu)造函數(shù)調(diào)用前調(diào)用,使用用:base(x,y)表示調(diào)用基類的構(gòu)造函數(shù)。在前面示例中,抽象基類表

22、示調(diào)用基類的構(gòu)造函數(shù)。在前面示例中,抽象基類Shape的構(gòu)造函數(shù)在執(zhí)行派生類的構(gòu)造函數(shù)在執(zhí)行派生類Ellipse構(gòu)造函數(shù)塊之前被調(diào)用,構(gòu)造函數(shù)塊之前被調(diào)用,使用使用:base(x,y)表示調(diào)用基類表示調(diào)用基類Shape的構(gòu)造函數(shù)。的構(gòu)造函數(shù)。public Ellipse(double x, double y) : base(x, y) /使用基類使用基類Shape的構(gòu)造函數(shù)的構(gòu)造函數(shù)l在派生類中,如果不使用在派生類中,如果不使用base關(guān)鍵字來顯式調(diào)用基類構(gòu)造函數(shù),關(guān)鍵字來顯式調(diào)用基類構(gòu)造函數(shù),則將隱式調(diào)用默認(rèn)構(gòu)造函數(shù)(如果有的話)。這意味著下面的構(gòu)則將隱式調(diào)用默認(rèn)構(gòu)造函數(shù)(如果有的話)。這意

23、味著下面的構(gòu)造函數(shù)隱式調(diào)用基類造函數(shù)隱式調(diào)用基類Shape默認(rèn)構(gòu)造函數(shù):默認(rèn)構(gòu)造函數(shù):public Ellipse(double x, double y) /隱式調(diào)用基類隱式調(diào)用基類Shape的構(gòu)的構(gòu)造函數(shù)造函數(shù): base() l如果基類沒有提供默認(rèn)構(gòu)造函數(shù),派生類必須使用如果基類沒有提供默認(rèn)構(gòu)造函數(shù),派生類必須使用 base 顯式調(diào)顯式調(diào)用基構(gòu)造函數(shù)。如沒有默認(rèn)構(gòu)造函數(shù),前面不使用用基構(gòu)造函數(shù)。如沒有默認(rèn)構(gòu)造函數(shù),前面不使用base 關(guān)鍵字的關(guān)鍵字的派生類構(gòu)造函數(shù)將無法編譯。派生類構(gòu)造函數(shù)將無法編譯。對象、類和結(jié)構(gòu)對象、類和結(jié)構(gòu)C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#析構(gòu)函數(shù)析

24、構(gòu)函數(shù)l在類的實例超出范圍時在類的實例超出范圍時, 類的實例將會自動執(zhí)行析構(gòu)函數(shù)。例如:類的實例將會自動執(zhí)行析構(gòu)函數(shù)。例如:Shape() /析構(gòu)函數(shù)析構(gòu)函數(shù), 對象銷毀時的清除語句對象銷毀時的清除語句. Console.WriteLine(調(diào)用調(diào)用Shape析構(gòu)函數(shù)析構(gòu)函數(shù)(0,1), x, y);Ellipse() /析構(gòu)函數(shù)析構(gòu)函數(shù) Console.WriteLine(調(diào)用調(diào)用Ellipse析構(gòu)函數(shù)析構(gòu)函數(shù)(0,1,Area2:f),x,y,Area();析構(gòu)函數(shù)特點:析構(gòu)函數(shù)特點:l一個類只能有一個析構(gòu)函數(shù)。一個類只能有一個析構(gòu)函數(shù)。l無法繼承或重載析構(gòu)函數(shù)。無法繼承或重載析構(gòu)函數(shù)。l

25、無法調(diào)用析構(gòu)函數(shù)。它們是被自動調(diào)用的。無法調(diào)用析構(gòu)函數(shù)。它們是被自動調(diào)用的。l析構(gòu)函數(shù)既沒有修飾符,也沒有參數(shù)。析構(gòu)函數(shù)既沒有修飾符,也沒有參數(shù)。l可以通過調(diào)用可以通過調(diào)用GC.Collect () 強(qiáng)制進(jìn)行垃圾回收,但大多數(shù)情況下強(qiáng)制進(jìn)行垃圾回收,但大多數(shù)情況下應(yīng)避免這樣做,因為這樣會導(dǎo)致性能問題。應(yīng)避免這樣做,因為這樣會導(dǎo)致性能問題。l調(diào)用對象結(jié)束將按照從派生程度最大的到派生程度最小的次序調(diào)調(diào)用對象結(jié)束將按照從派生程度最大的到派生程度最小的次序調(diào)用析構(gòu)函數(shù)。用析構(gòu)函數(shù)。對象、類和結(jié)構(gòu)對象、類和結(jié)構(gòu)C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#方法聲明方法聲明方法是包含一系列語句的代碼

26、塊,是類或結(jié)構(gòu)中用于執(zhí)行計算或其它行為的成員。在 C# 中,每個執(zhí)行指令都是在方法中完成的。 方法在類或結(jié)構(gòu)中聲明,聲明時需要指定訪問級別、返回值、方法名稱以及任何方法參數(shù)。方法參數(shù)放在括號中,并用逗號隔開。空括號表示方法不需要參數(shù)。方法的聲明格式: 特征 修飾符 方法名稱(形式化參數(shù)表) 方法體 方法的修飾符可以是(public, protected,internal,private,static,abstract,virtual,override等)及其組合。例如下面例子的Area方法:Shape類:public abstract double Area();/抽象方法,需要在派生類重載該

27、方法Ellipse類:public override double Area()/派生類重載基類抽象方法方法C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#方法的參數(shù)方法的參數(shù)C#中方法的參數(shù)有以下兩種類型:中方法的參數(shù)有以下兩種類型:l值傳遞類型參數(shù)值傳遞類型參數(shù):不含任何修飾符。如:不含任何修飾符。如:void SquareIt(int x)l引用傳遞類型參數(shù)引用傳遞類型參數(shù):以以ref 或或out 修飾符聲明。如:修飾符聲明。如:void SquareIt(ref int x)方法值傳遞類型參數(shù)意味著向方法傳遞變量的一個副本。方法內(nèi)方法值傳遞類型參數(shù)意味著向方法傳遞變量的一個副本。方

28、法內(nèi)發(fā)生的參數(shù)更改對該變量中存儲的原始數(shù)據(jù)無任何影響。而引用傳遞發(fā)生的參數(shù)更改對該變量中存儲的原始數(shù)據(jù)無任何影響。而引用傳遞類型參數(shù)意味所調(diào)用的方法可更改參數(shù)的原始數(shù)據(jù)值。類型參數(shù)意味所調(diào)用的方法可更改參數(shù)的原始數(shù)據(jù)值。向方法傳遞結(jié)構(gòu)和類引用之間的區(qū)別:向方法傳遞向方法傳遞結(jié)構(gòu)和類引用之間的區(qū)別:向方法傳遞結(jié)構(gòu)結(jié)構(gòu)時,傳遞時,傳遞的是該結(jié)構(gòu)的副本,而在傳遞的是該結(jié)構(gòu)的副本,而在傳遞類類實例時,傳遞的是一個引用。實例時,傳遞的是一個引用。傳遞類型參數(shù)修飾符傳遞類型參數(shù)修飾符out與與ref 的區(qū)別在于:傳遞到的區(qū)別在于:傳遞到 ref的參數(shù)必的參數(shù)必須先初始化。而須先初始化。而out 的參數(shù)在傳

29、遞之前不需要顯式初始化。的參數(shù)在傳遞之前不需要顯式初始化。值傳遞有以下兩種類型:值傳遞有以下兩種類型:l值傳遞值類型,如:值傳遞值類型,如:void SquareIt(int x) 參數(shù)參數(shù)int x 是值類型。是值類型。l值傳遞引用類型,如:值傳遞引用類型,如:void Change(int pArray) 數(shù)組數(shù)組pArray 為引用類型。為引用類型。引用傳遞有以下兩種類型:引用傳遞有以下兩種類型:l引用傳遞值類型,如:引用傳遞值類型,如:void SquareIt(ref int x) l引用傳遞引用類型,如:引用傳遞引用類型,如:void Change(ref int pArray)方

30、法方法C#程序設(shè)計課件(資料全集)c#值傳遞值類型參數(shù)示例 ( ParamSample項目代碼):class PassingValByVal static void SquareIt(int x) x *= x; System.Console.WriteLine(SquareIt方法內(nèi)的n值: 0, x); static void Main() int n = 5; System.Console.WriteLine(調(diào)用SquareIt方法前的n值: 0, n); SquareIt(n); / 通過值來傳遞值 System.Console.WriteLine(調(diào)用SquareIt方法后的n值:

31、 0, n); 該程序運(yùn)行輸出:調(diào)用SquareIt方法前的n值: 5 SquareIt方法內(nèi)的n值: 25 調(diào)用SquareIt方法后的n值: 5 在這例子里,變量 n 為值類型,包含數(shù)據(jù)(值為 5)。當(dāng)調(diào)用 SquareIt 時,n 的內(nèi)容被復(fù)制到參數(shù) x 中,在方法內(nèi)將該參數(shù)求平方。但在 Main 中,n 的值在調(diào)用 SquareIt 方法前后是相同的。實際上,方法內(nèi)發(fā)生的更改只影響局部變量 x。C#程序設(shè)計課件(資料全集)c#值傳遞引用類型例子:class PassingRefByVal static void Change(int pArray) pArray0 = 888; / 將

32、pArray的第一個元素賦值為888, 改變arr0 pArray = new int5 -3, -1, -2, -3, -4 ; / 引用新的數(shù)組,不改變arr System.Console.WriteLine(方法內(nèi)的數(shù)組第一元素: 0, pArray0); static void Main() int arr = 1, 4, 5 ; System.Console.WriteLine(調(diào)用方法前的數(shù)組第一元素:0, arr0); Change(arr); System.Console.WriteLine(調(diào)用方法后的數(shù)組第一元素:0, arr0); 在上個示例中,數(shù)組 arr 為引用類型,

33、在未使用 ref 參數(shù)的情況下傳遞給方法。在此情況下,將向Change方法傳遞指向 arr 的引用的一個副本。Change方法有可能更改數(shù)組元素的內(nèi)容,輸出顯示arr0 從 1 改為 888。但是,在 Change 方法內(nèi)使用 new 運(yùn)算符來分配新的內(nèi)存部分,將使變量 pArray 引用新的數(shù)組。因此,這之后的任何更改都不會影響原始數(shù)組 arr(它是在 Main 內(nèi)創(chuàng)建的)。該程序運(yùn)行輸出:調(diào)用方法前的數(shù)組第一元素:1方法內(nèi)的數(shù)組第一元素: -3調(diào)用方法后的數(shù)組第一元素:888C#程序設(shè)計課件(資料全集)c#引用傳遞值類型引用傳遞值類型示例 class PassingValByRef/ 參數(shù)

34、X的值通過關(guān)鍵字ref來傳遞,改變x的值,將會改變輸入的x的值 static void SquareIt(ref int x) x *= x; System.Console.WriteLine(SquareIt方法內(nèi)的n值: 0, x); static void Main() int n = 5; System.Console.WriteLine(調(diào)用SquareIt方法前的n值: 0, n); SquareIt(ref n); / 通過ref關(guān)鍵字來傳遞變量引用. System.Console.WriteLine(調(diào)用SquareIt方法后的n值: 0, n); 該程序運(yùn)行輸出:調(diào)用Squa

35、reIt方法前的n值: 5 SquareIt方法內(nèi)的n值: 25 調(diào)用SquareIt方法后的n值: 25 本示例中,傳遞的不是 n 的值,而是對 n 的引用。參數(shù) x 不是 int 類型,它是對 int 的引用(本例中為對 n 的引用)。因此,當(dāng)在方法內(nèi)對 x 求平方時,實際被求平方的是 x 所引用的項:n。C#程序設(shè)計課件(資料全集)c#引用傳遞引用類型引用傳遞引用類型示例:class PassingRefByRef static void Change(ref int pArray) / 下面兩個數(shù)組賦值都將改變原始的元素 pArray0 = 888; / 將pArray的第一個元素賦值

36、為 pArray = new int5 -3, -1, -2, -3, -4 ; / pArray 引用新的數(shù)組 System.Console.WriteLine(Change方法內(nèi)的數(shù)組第一元素: 0, pArray0); static void Main() int arr = 1, 4, 5 ; System.Console.WriteLine(調(diào)用Change方法前的數(shù)組第一元素:0, arr0); Change(ref arr);/通過ref關(guān)鍵字來傳遞數(shù)組引用 System.Console.WriteLine(調(diào)用Change方法后的數(shù)組第一元素:0, arr0); 該程序運(yùn)行輸出

37、:調(diào)用Change方法前的數(shù)組第一元素:1Change方法內(nèi)的數(shù)組第一元素: -3調(diào)用Change方法后的數(shù)組第一元素:-3本示例中Change方法內(nèi)發(fā)生的所有更改都影響 Main 中的原始數(shù)組。實際上,使用 new 運(yùn)算符對原始數(shù)組進(jìn)行了重新分配。因此,調(diào)用 Change 方法后,對 arr 的任何引用都將指向 Change 方法中創(chuàng)建的五個元素的數(shù)組。C#程序設(shè)計課件(資料全集)c#參數(shù)數(shù)組參數(shù)數(shù)組params當(dāng)方法的參數(shù)數(shù)量不確定時,可以考慮使用參數(shù)數(shù)組params作為方法參數(shù),如:void UseParams(params int list);在方法聲明中的 params 關(guān)鍵字之后不

38、允許任何其他參數(shù),并且在方法聲明中只允許一個 params 關(guān)鍵字。項目params1的代碼如下:public class MyClass public static void UseParams(params int list) for (int i = 0; i list.Length; i+) Console.WriteLine(listi); public static void UseParams2(params object list) for (int i = 0; i list.Length; i+) Console.WriteLine(listi); static void

39、Main() UseParams(1, 2);/可以使用不同數(shù)目的整數(shù)作為參數(shù) UseParams2(1, a, test);/可以使用不同數(shù)目的任何類型值作為參數(shù) int myarray = new int3 10, 11, 12 ; UseParams(myarray); /可以使用數(shù)組作為參數(shù) C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#類的靜態(tài)成員和靜態(tài)類類的靜態(tài)成員和靜態(tài)類靜態(tài)類和類成員用于創(chuàng)建無需創(chuàng)建類的實例就能夠靜態(tài)類和類成員用于創(chuàng)建無需創(chuàng)建類的實例就能夠訪問的數(shù)據(jù)和方法。靜態(tài)類成員可用于獨立于任何對象標(biāo)訪問的數(shù)據(jù)和方法。靜態(tài)類成員可用于獨立于任何對象標(biāo)識的數(shù)據(jù)和行為:無

40、論對象發(fā)生什么更改,這些數(shù)據(jù)和函識的數(shù)據(jù)和行為:無論對象發(fā)生什么更改,這些數(shù)據(jù)和函數(shù)都不會隨之變化。靜態(tài)類成員是一種特殊的成員數(shù)都不會隨之變化。靜態(tài)類成員是一種特殊的成員,它不屬它不屬于類的某一個具體的實例。當(dāng)類只有靜態(tài)成員時就可以使于類的某一個具體的實例。當(dāng)類只有靜態(tài)成員時就可以使用靜態(tài)類。用靜態(tài)類。類的靜態(tài)成員類的靜態(tài)成員在成員的返回類型之前使用在成員的返回類型之前使用 static 關(guān)鍵字來聲明靜關(guān)鍵字來聲明靜態(tài)類成員。即使沒有創(chuàng)建類的實例,也可以調(diào)用該類中的態(tài)類成員。即使沒有創(chuàng)建類的實例,也可以調(diào)用該類中的靜態(tài)方法、字段、屬性或事件。如果創(chuàng)建了該類的任何實靜態(tài)方法、字段、屬性或事件。如

41、果創(chuàng)建了該類的任何實例,不能使用實例來訪問靜態(tài)成員。靜態(tài)成員通常用于表例,不能使用實例來訪問靜態(tài)成員。靜態(tài)成員通常用于表示不會隨對象狀態(tài)而變化的數(shù)據(jù)或計算。非靜態(tài)方法可以示不會隨對象狀態(tài)而變化的數(shù)據(jù)或計算。非靜態(tài)方法可以訪問類中的靜態(tài)或非靜態(tài)成員訪問類中的靜態(tài)或非靜態(tài)成員,而靜態(tài)方法只能訪問類中的而靜態(tài)方法只能訪問類中的靜態(tài)成員。靜態(tài)成員。靜態(tài)類:當(dāng)類中沒有依賴類的特定對象的數(shù)據(jù)或行靜態(tài)類:當(dāng)類中沒有依賴類的特定對象的數(shù)據(jù)或行為時,即僅包含靜態(tài)成員,就可以使用。靜態(tài)類聲明為為時,即僅包含靜態(tài)成員,就可以使用。靜態(tài)類聲明為static,以指示它僅包含靜態(tài)成員的靜態(tài)類。不能使用,以指示它僅包含靜態(tài)

42、成員的靜態(tài)類。不能使用 new 關(guān)鍵字創(chuàng)建靜態(tài)類的實例。關(guān)鍵字創(chuàng)建靜態(tài)類的實例。靜態(tài)成員和靜態(tài)類靜態(tài)成員和靜態(tài)類C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#類靜態(tài)成員例子class classA int x; static int y; static public void F() /x = 1; 錯誤不允許訪問 y = 2; /正確允許訪問 class TestA static void Main() classA aClass = new classA();/創(chuàng)建類A的實例aObject /aClass.F(); /錯誤,不能使用類A的實例aObject來訪問靜態(tài)成員 classA

43、.F(); /正確,使用類來訪問靜態(tài)成員 靜態(tài)成員和靜態(tài)類靜態(tài)成員和靜態(tài)類C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#靜態(tài)類例子public static class TemperatureConverter/靜態(tài)類/靜態(tài)方法 public static double CelsiusToFahrenheit(string temperatureCelsius) / 將string型的temperatureCelsius轉(zhuǎn)化成double型 double celsius = System.Double.Parse(temperatureCelsius); / 將計算結(jié)果也轉(zhuǎn)換成doubl

44、e型 double fahrenheit = (celsius * 9 / 5) + 32; return fahrenheit; class TestTemperatureConverter static void Main() /調(diào)用靜態(tài)類的靜態(tài)方法 double F = TemperatureConverter.CelsiusToFahrenheit(38.9); 靜態(tài)成員和靜態(tài)類靜態(tài)成員和靜態(tài)類C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#繼承多態(tài)性繼承多態(tài)性l通過繼承,一個通過繼承,一個類類可以用作多種類型:可以用作它可以用作多種類型:可以用作它自己的類型、任何基類型,或者在實

45、現(xiàn)接口時用作自己的類型、任何基類型,或者在實現(xiàn)接口時用作任何任何接口接口類型。這稱為多態(tài)性。類型。這稱為多態(tài)性。C# 中的每種類型中的每種類型都是多態(tài)的。類型可用作它們自己的類型或用作都是多態(tài)的。類型可用作它們自己的類型或用作 Object類型,因為任何類型都自動將類型,因為任何類型都自動將 Object 當(dāng)作當(dāng)作基類型。基類型。l多態(tài)性不僅對派生類很重要,對基類也很重要。任多態(tài)性不僅對派生類很重要,對基類也很重要。任何情況下,使用何情況下,使用基基類實際上都可能是在使用已強(qiáng)制類實際上都可能是在使用已強(qiáng)制轉(zhuǎn)換為基類類型的派生類對象。轉(zhuǎn)換為基類類型的派生類對象。l當(dāng)派生類從基類繼承時,它會獲得基

46、類的所有非私當(dāng)派生類從基類繼承時,它會獲得基類的所有非私有的方法、字段、屬性和事件。若要更改基類的數(shù)有的方法、字段、屬性和事件。若要更改基類的數(shù)據(jù)和行為,有兩種選擇:可以使用新的派生成員替據(jù)和行為,有兩種選擇:可以使用新的派生成員替換基成員,或者可以重寫虛擬的基成員。換基成員,或者可以重寫虛擬的基成員。繼承繼承C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#使用使用new關(guān)鍵字關(guān)鍵字派生類可以包含與基類方法名稱相同的數(shù)據(jù)和方派生類可以包含與基類方法名稱相同的數(shù)據(jù)和方法成員。使用新的派生成員替換基類的成員需要使用法成員。使用新的派生成員替換基類的成員需要使用 new 關(guān)鍵字。如果基類定義了一

47、個方法、字段或?qū)傩?,關(guān)鍵字。如果基類定義了一個方法、字段或?qū)傩?,則則new關(guān)鍵字用于在派生類中創(chuàng)建該方法、字段或?qū)傩躁P(guān)鍵字用于在派生類中創(chuàng)建該方法、字段或?qū)傩缘男露x。的新定義。new 關(guān)鍵字放置在要替換的類成員的返回類關(guān)鍵字放置在要替換的類成員的返回類型之前。例如:型之前。例如:public class BaseClass public void DoWork() Console.WriteLine(Base DoWork); public int WorkField; public int WorkProperty get return 0; public class DerivedCla

48、ss : BaseClass public new void DoWork() Console.WriteLine(Derive DoWork); public new int WorkField; public new int WorkProperty get return 1; 繼承繼承C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#使用使用new關(guān)鍵字關(guān)鍵字使用使用new關(guān)鍵字時,調(diào)用的是新的類成員而不是已被替換關(guān)鍵字時,調(diào)用的是新的類成員而不是已被替換的基類成員。這些基類成員稱為隱藏成員。如果將派生類的實例強(qiáng)的基類成員。這些基類成員稱為隱藏成員。如果將派生類的實例強(qiáng)制轉(zhuǎn)換為基類的實

49、例,就仍然調(diào)用隱藏類成員。例如:制轉(zhuǎn)換為基類的實例,就仍然調(diào)用隱藏類成員。例如:public class test static void Main() DerivedClass B = new DerivedClass(); B.WorkField = 2; B.DoWork(); /調(diào)用調(diào)用DerivedClass方法方法DoWork().顯示顯示“Derive DoWork” Console.WriteLine(B.WorkField=0, B.WorkField); /顯示顯示“B.WorkField=2” BaseClass A = (BaseClass)B; /A.WorkFiel

50、d未賦值未賦值,為為int的默認(rèn)值的默認(rèn)值 A.DoWork(); /調(diào)用調(diào)用BaseClass的方法的方法DoWork().顯示顯示“Base DoWork” Console.WriteLine(A.WorkField=0, A.WorkField); /顯示顯示“A.WorkField=0”繼承繼承C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#使用使用virtual和和override關(guān)鍵字關(guān)鍵字為了使派生類的實例完全接替來自基類的類成員,為了使派生類的實例完全接替來自基類的類成員,基類必須將該成員聲明為虛擬的。這是通過在該成員的基類必須將該成員聲明為虛擬的。這是通過在該成員的返回類

51、型之前添加返回類型之前添加 virtual 關(guān)鍵字來實現(xiàn)的。字段不能關(guān)鍵字來實現(xiàn)的。字段不能是虛擬的,只有方法、屬性、事件和索引器才可以是虛是虛擬的,只有方法、屬性、事件和索引器才可以是虛擬的。然后,派生類可以選擇使用擬的。然后,派生類可以選擇使用 override 關(guān)鍵字而關(guān)鍵字而不是不是 new,將基類實現(xiàn)替換為它自己的實現(xiàn)。當(dāng)派生類,將基類實現(xiàn)替換為它自己的實現(xiàn)。當(dāng)派生類重寫某個虛擬成員時,即使該派生類的實例被當(dāng)作基類重寫某個虛擬成員時,即使該派生類的實例被當(dāng)作基類的實例訪問,也會調(diào)用派生類的成員,而在派生類可以的實例訪問,也會調(diào)用派生類的成員,而在派生類可以使用使用 base 關(guān)鍵字訪

52、問基類的成員,例如:關(guān)鍵字訪問基類的成員,例如:public class BaseClass public virtual void DoWork() Console.WriteLine(Base DoWork); public virtual int WorkProperty get return 0; 繼承繼承C#程序設(shè)計課件(資料全集)c#public class DerivedClass : BaseClass public override void DoWork() base.DoWork();/調(diào)用調(diào)用BaseClass方法方法DoWork()顯示顯示Base DoWork Co

53、nsole.WriteLine(Derive DoWork); public override int WorkProperty get return 1; public class test static void Main() DerivedClass B = new DerivedClass(); /調(diào)用重寫方法調(diào)用重寫方法DoWork().顯示顯示Base DoWork和和“Derive DoWork” B.DoWork(); /顯示顯示B.WorkProperty=1” Console.WriteLine(B.WorkProperty=0, B.WorkProperty); Base

54、Class A = (BaseClass)B; A.DoWork(); /調(diào)用重寫方法調(diào)用重寫方法DoWork().顯示顯示“Derive DoWork” /顯示顯示B.WorkProperty=1” Console.WriteLine(A.WorkProperty=0, A.WorkProperty); C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#abstract抽象類抽象類l使用使用 abstract 關(guān)鍵字可以創(chuàng)建僅用于繼承用途的類關(guān)鍵字可以創(chuàng)建僅用于繼承用途的類和和類類成員。將類聲明為抽象類的方法是在類定義中成員。將類聲明為抽象類的方法是在類定義中將關(guān)鍵字將關(guān)鍵字 abstra

55、ct 置于關(guān)鍵字置于關(guān)鍵字 class 的前面。例的前面。例如:如:abstract class Shape;l抽象類不能實例化。抽象類的用途是提供多個派生抽象類不能實例化。抽象類的用途是提供多個派生類可共享的基類的公共定義。在抽象類中可以定義類可共享的基類的公共定義。在抽象類中可以定義抽象方法。方法是將關(guān)鍵字抽象方法。方法是將關(guān)鍵字 abstract 添加到方法的添加到方法的返回類型的前面。返回類型的前面。l例如:例如:public abstract double Area();l抽象方法沒有實現(xiàn),所以方法定義后面是分號,而抽象方法沒有實現(xiàn),所以方法定義后面是分號,而不是常規(guī)的方法塊不是常規(guī)

56、的方法塊。抽象類的派生類必須實現(xiàn)所。抽象類的派生類必須實現(xiàn)所有抽象方法。有抽象方法。繼承繼承C#.NET程序設(shè)計C#程序設(shè)計課件(資料全集)c#sealed密封類和類成員密封類和類成員l可以將類聲明為可以將類聲明為sealed密封類。密封類主要用于密封類。密封類主要用于防止派生。聲明方法是在類定義中將關(guān)鍵字防止派生。聲明方法是在類定義中將關(guān)鍵字 sealed 置于關(guān)鍵字置于關(guān)鍵字 class 的前面。例如:的前面。例如:public sealed class sClass 類定義體類定義體。密封類不能用。密封類不能用作基類。因此,它也不能是抽象類。作基類。因此,它也不能是抽象類。l在對基類的虛

57、成員進(jìn)行重寫的派生類上的類成員在對基類的虛成員進(jìn)行重寫的派生類上的類成員(包括方法、字段、屬性或事件)可以將該成員(包括方法、字段、屬性或事件)可以將該成員聲明為密封成員。在用于以后的派生類時,這將聲明為密封成員。在用于以后的派生類時,這將取消成員的虛效果。方法是在類成員聲明中將取消成員的虛效果。方法是在類成員聲明中將 sealed 關(guān)鍵字置于關(guān)鍵字置于 override 關(guān)鍵字的前面。例如:關(guān)鍵字的前面。例如:lpublic class sClass : bClass lpublic sealed override void DoWork() l下面下面abstractShape項目的代碼演

58、示項目的代碼演示 Shape 的多的多個子類,并演示它們?nèi)绾沃貙憘€子類,并演示它們?nèi)绾沃貙?Area 屬性來提供自屬性來提供自己的實現(xiàn)。然后創(chuàng)建若干己的實現(xiàn)。然后創(chuàng)建若干 Shape 派生對象,并輸派生對象,并輸出它們的面積。出它們的面積。繼承繼承C#程序設(shè)計課件(資料全集)c#public abstract class Shape private string m_id; public Shape(string s) Id = s; public string Id/屬性Id get return m_id; set m_id = value; public abstract double

59、Area get;/抽象只讀屬性Area public override string ToString() return Id + Area = + string.Format(0:F2, Area); public class Square : Shape private int m_side;/正方形邊長 public Square(int side, string id): base(id) m_side = side; public override double Area get return m_side * m_side; /正方形面積邊長邊長C#程序設(shè)計課件(資料全集)c#p

60、ublic class Rectangle : Shape private int m_width; private int m_height; public Rectangle(int width, int height, string id): base(id) m_width = width; m_height = height; public override double Area getreturn m_width * m_height; /長方形面積class TestClass static void Main() Shape shapes = new Square(5, Sq

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論