C#程式設計利器之一:類(Class)
物件導向的程式設計(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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#程式設計利器系列文章C#程式設計
- C#程式設計利器之三:介面(Interface)C#程式設計
- ABAP 程式語言中 Class(類)的設計原理剖析
- 瞭解下C# 類(Class)C#
- perl 程式設計利器程式設計
- C# - 非同步程式設計 - BackgroundWorker 類C#非同步程式設計
- c#靜態類static class示例C#
- C#程式設計利器之二:結構與列舉(Structure and enumeration)C#程式設計Struct
- 非同步程式設計利器:CompletableFuture非同步程式設計
- c#程式設計C#程式設計
- 程式設計師的出路之一程式設計師
- Linux程式設計之一(轉)Linux程式設計
- C 語言程式設計利器之 CLion程式設計
- 結對程式設計利器:SSH和Tmux程式設計UX
- linux程式設計之一:入門Linux程式設計
- 提高程式設計師的幾大利器程式設計師
- C# 管道式程式設計C#程式設計
- C# 併發程式設計C#程式設計
- C# 非同步程式設計C#非同步程式設計
- C#~非同步程式設計C#非同步程式設計
- C#程式設計規範C#程式設計
- C#非同步程式設計C#非同步程式設計
- JavaScript新增class樣式類程式碼JavaScript
- JavaScript class 類JavaScript
- JavaScript:類(class)JavaScript
- c# 程式設計學習(四)C#程式設計
- C#程式設計學習(一)C#程式設計
- c# 程式設計學習(二)C#程式設計
- C# .NET網路程式設計C#程式設計
- [03] C# Alloc Free程式設計C#程式設計
- c# windows程式設計基礎C#Windows程式設計
- C#程式設計命名規範C#程式設計
- c# winform程式設計轉例C#ORM程式設計
- C#程式設計好習慣C#程式設計
- c#網路程式設計初探C#程式設計
- Windows SDK程式設計之一 視窗示例程式 (轉)Windows程式設計
- C++程式設計思想筆記之一 (轉)C++程式設計筆記
- C# interface abstract classC#