C#程式設計利器之一:類(Class)

iDotNetSpace發表於2009-05-15

    物件導向的程式設計(Object-Oriented Programming,簡記為OOP)是一種功能非常強大的程式設計方法,立意於建立軟體重用程式碼,以類為基礎去思考程式設計問題。類是OOP中的核心組成元素,通常都是使用類來“封裝”物件(屬性、行為)。在經典圖書《程式碼大全》裡定義:“建立高質量的類,第一步,可能也是最重要的一步,就是建立一個好的介面。這也包括了建立一個可以通過介面來展現的合理的抽象,並確保細節仍被隱藏在抽象背後。”,其實介面也是一個類,一個更為抽象的類.


    在我以前的一篇文章裡曾經提到:“物件導向程式設計,並不是類越多越好,類的劃分是為了封裝,但分類的基礎是抽象,具有相同屬性和功能的物件的抽象集合才是類。----選自《大話設計模式》” 。

      可見,在OOP中,類是何等的重要,本文將以類作為談論點,全方面的分析和介紹類的各種相關知識點。

 

一. 日常生活中的物件

     在大多數人眼裡,物件是一個抽象的名詞,而類呢則更為抽象。日常生活中,可以把物件理解為可辯識的一種實體。如汽車、輪船、飛機、電腦等。如果把物件和程式聯絡起來,則可看作是在程式中表示的一個實體。

      一切從現實出發,才能使編寫出的程式碼更能反映出真實的生活。如電腦這個物件,則包括有主機板,硬碟,顯示卡,記憶體等組成元素。然而實際的程式設計中並不是這麼的簡單,但是我們還是得從現實中去分析。以這種方式去考慮程式的設計,就會得到很多的好處:程式更容易設計,程式的體系結構更直觀,更容易理解,更清晰的反映了程式從真實生活中抽象出來的含義,更便於多個開發人員一起工作,因為他們可以在程式碼中處理不同的物件,只需要知道其他人的物件做什麼工作,無需擔心其他人的程式碼的工作細節。

 

二. 程式設計中的物件

     我們平時在程式設計中用到過些什麼物件呢?我想無外乎是兩大類:系統物件和使用者自定義物件。OK, 為了更清楚的說明這點,我們從“Hello World”開始吧。看看如下程式碼定義:

Console.WriteLine("Hello Wrold");
     上面這句程式碼對於正在看本文的你來說,我想應該是在熟悉不過了.他的功能就是將“Hello World”這個字串在控制檯輸出.然而,出此之外,這句程式碼還隱含著其他的相關知識.那麼具體是什麼呢?其實我們在編寫這句程式碼的時候已經使用物件了.Console就是一個物件,.NET Framework提供的一個系統物件,我們之所以能夠通過WriteLine方法實現輸出,是因為我們呼叫了這個系統物件的方法. 這裡Console就是一個典型的系統物件.

 

     下面我們來看看什麼的自定義物件,首先我們來分析一下現實生活中的物件.以電腦來說,一臺電腦大概由主機板,硬碟,顯示卡,記憶體等眾多元素組成.通過抽象,我們就可以認為電腦就是一個物件,主機板,顯示卡這些組成元素則是電腦這個物件的屬性.下面是電腦類的定義:

 1/**////


 2/// 電腦類
 3///

 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/  或 http://www.cnblogs.com/   作者:Beniao

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-598254/,如需轉載,請註明出處,否則將追究法律責任。

相關文章