面向對象的程序設計(Object-Oriented Programming,簡記為OOP)是一種功能非常強大的編程方法, 立意於創建軟件重用代碼,以類為基礎去思考編程問題。類是OOP中的核心組成元素,通常都是使用類來 “封裝”對象(屬性、行為)。在經典圖書《代碼大全》裡定義:“創建高質量的類,第一步,可能也是 最重要的一步,就是創建一個好的接口。這也包括了創建一個可以通過接口來展現的合理的抽象,並確保 細節仍被隱藏在抽象背後。”,其實接口也是一個類,一個更為抽象的類.
在我以前的一篇文章裡曾經提到:“面向對象編程,並不是類越多越好,類的劃分是為了封裝,但分類 的基礎是抽象,具有相同屬性和功能的對象的抽象集合才是類。----選自《大話設計模式》” 。
可見,在OOP中,類是何等的重要,本文將以類作為談論點,全方面的分析和介紹類的各種相關知識點 。
一. 日常生活中的對象
在大多數人眼裡,對象是一個抽象的名詞,而類呢則更為抽象。日常生活中,可以把對象理解為可辯 識的一種實體。如汽車、輪船、飛機、電腦等。如果把對象和程序聯系起來,則可看作是在程序中表示的 一個實體。
一切從現實出發,才能使編寫出的代碼更能反映出真實的生活。如電腦這個對象,則包括有主板,硬 盤,顯卡,內存等組成元素。然而實際的編程中並不是這麼的簡單,但是我們還是得從現實中去分析。以 這種方式去考慮程序的設計,就會得到很多的好處:程序更容易設計,程序的體系結構更直觀,更容易理 解,更清晰的反映了程序從真實生活中抽象出來的含義,更便於多個開發人員一起工作,因為他們可以在 代碼中處理不同的對象,只需要知道其他人的對象做什麼工作,無需擔心其他人的代碼的工作細節。
二. 編程中的對象
我們平時在編程中用到過些什麼對象呢?我想無外乎是兩大類:系統對象和用戶自定義對象。OK, 為 了更清楚的說明這點,我們從“Hello World”開始吧。看看如下代碼定義:
Console.WriteLine("Hello Wrold");
上面這句代碼對於正在看本文的你來說,我想應該是在熟悉不過了.他的功能就是將“Hello World”這 個字符串在控制台輸出.然而,出此之外,這句代碼還隱含著其他的相關知識.那麼具體是什麼呢?其實我們 在編寫這句代碼的時候已經使用對象了.Console就是一個對象,.NET Framework提供的一個系統對象,我們 之所以能夠通過WriteLine方法實現輸出,是因為我們調用了這個系統對象的方法. 這裡Console就是一個 典型的系統對象.
下面我們來看看什麼的自定義對象,首先我們來分析一下現實生活中的對象.以電腦來說,一台電腦大概 由主板,硬盤,顯卡,內存等眾多元素組成.通過抽象,我們就可以認為電腦就是一個對象,主板,顯卡這些組 成元素則是電腦這個對象的屬性.下面是電腦類的定義:
1/**//// <summary>
2/// 電腦類
3/// </summary>
4public class Computer
5{
6 private string name;
7 public string Name
8 {
9 get { return name; }
10 set { name = value; }
11 }
12
13 public string 主板 = "精英主板";
14 public string 硬盤 = "希捷硬盤";
15 public string 內存 = "金士頓";
16 public string 顯卡 = "七彩紅";
17 //其他組成元素
18
19 public Computer()
20 { }
21
22 public Computer(string name)
23 {
24 this.Name = name;
25 }
26}
上面這段代碼說明什麼呢?我們定義了一個Computer類,類裡定義了幾個成員,還有構造方法等.為了更 清晰的說明這樣做的目的,我們可以先來做個測試.建立兩個對象,然後判斷他門的屬性是不是同一個.代碼 如下:
1class Program
2{
3 static void Main(string[] args)
4 {
5 Computer zhangsan = new Computer("張三");
6 Computer lisi = new Computer("李四");
7
8 Console.WriteLine(zhangsan.主板 == lisi.主板);
9 }
10}
通過運行上面程序段,結果為:true.這說明什麼,說明張三的主板和李四的主板是同一個嗎?不是,我們 應該說張三和李四都是使用的同一個類的對象.這裡Computer類到底做了什麼呢?封裝屬性和行為嗎?最容 易的理解便是把這個類看作是一種新的數據類型.也就是說Computer是一種數據類型,而zhangsan和lisi則 是這種新數據類型的變量,用OOP的話來說的話,zhangsan和lisi則是Computer這個對象的實例或是對象.
三、類的相關特性
類的特性有很多,這裡我就簡單的介紹下最常用的幾個特性。
1. 類名
類名是唯一一個用於區分其他類的特性,如同人的名字一樣。當然在同一個項目或是程序集或是框架 中,會出現同名的類,就如同世界之大,名字相同的人到處都有一樣。而現實生活中的同名人可以根據他 所在的國家、省份、區縣、鄉村以及家庭來區分,對於同名的類呢則是通過命名空間來區分的。
如上電腦類Computer,Computer就是電腦類的類名,用這個名字類區分其他類。
2. 屬性
屬性是一個類的重要組成部分,就以上面的電腦類(Computer)來說吧。name,主板,顯卡等都是 Computer類的屬性。我們可以通過類對象(實例對象)去訪問他們,示意性代碼如下:
1class Computer
2{
3 public string Name = "張三";
4}
5class TestComputer
6{
7 void Method()
8 {
9 Computer computer = new Computer();
10 Console.WriteLine(computer.Name);
11 }
12}
在實際的開發中,我們通常將屬性設置為private的,通過對外提供get;set;屬性訪問器供外部調用, 關於這點這裡就不作詳細介紹。
3. 構造方法
構造方法是用得最多的一個特性,與普通的方法相比不同的是構造方法無返回值修飾符,每當你要創 建一個對象實際上就是在調用給對象的構造方法。實際開發中,我們可以多次重載構造方法,以及通過構 造方法來初始化屬性的值。示意性代碼如下:
1class Computer
2{
3 public Computer() { } //無參構造方法
4 public Computer(string name) //重載構造方法,帶一個參數
5 {
6 this.Name = name;
7 }
8
9 private string name;
10 public string Name
11 {
12 get { return name; }
13 set { name = value; }
14 }
15}
16class TestComputer
17{
18 void Method()
19 {
20 Computer computer = new Computer(); //調用無參構造方法
21 computer.Name = "張三"; // 通過屬性訪問器設置屬性的值
22 Console.WriteLine(computer.Name); //調用重載的帶參數構造方法
23 computer = new Computer("張三"); //通過構造方法設置屬性的值
24 Console.WriteLine(computer.Name);
25 }
26}
4. 行為(方法)
這點很容易理解,類的行為也就是類的方法,如上面類構造方法裡的程序代碼,在TestComputer類裡 就有一個方法Method,我們可以稱為是TestComputer類的行為或是方法。
5. 類對象(實例)
這裡也很容易理解,在之前我們已經使用了多次類的對象了。如TestComputer類的Method方法裡,就 創建了Computer類型的類對象computer,通過此對象,我們可以很方便的訪問Computer類裡公開的屬性和 方法,示意代碼如下:
1public void Method()
2{
3 //創建一Computer類型的對象computer
4 Computer computer = new Computer("張三");
5 string name = computer.Name; //通過對象computer去調用Computer類的屬性Name
6}
6. 類繼承
由於C#是單繼承語言,因此在類的繼承上只支持單一繼承,也就是說一個類只能有一個父類,但是可 以繼承多個接口。
1class A
2{
3 public string Name { get; set; };
4}
5class B:A //類B繼承於類A
6{
7
8}
1class A
2{
3 public string Name { get; set; };
4}
5interface Ia
6{
7 void MethodA();
8}
9class B:A,Ia //類B繼承於類A,同時繼承於Ia接口
10{
11 public void MethodA()
12 {
13 //
14 }
15}
1class A
2{
3 public string Name { get; set; };
4}
5interface Ia
6{
7 void MethodA();
8}
9interface Ib
10{
11 void MethodB();
12}
13class B:A,Ia,Ib //類B繼承於類A,同時繼承了Ia,Ib接口
14{
15 public void MethodA()
16 {
17 //
18 }
19
20 public void MethodB()
21 {
22 //..
23 }
24}
7. 類修飾
關於類修飾這裡就不做詳細介紹,只是簡單的提出幾個概念。詳細請查閱相關資料了解更多。下面是 幾種常見的類修飾:
1public class ClassName { }
2public static class ClassName { }
3public sealed class ClassName { }
4public partial class ClassName { }
本文介紹了與類相關的常用知識點,當然類還有很多的知識點本文裡沒有提出,要更詳細的了解類請 查閱相關書籍和資料,篇幅限制,本文就介紹於此,希望本文對新手有所幫助。個人能力有限,文中難免 會出錯,還望大家勇言提出,謝謝。
出處:http://beniao.cnblogs.com/