面向過程,面向對象的深入理解二
面向對象介紹,類和對象
首先作為基礎知識的回顧,我們可以看下我之前寫過的文章:C#中超級好用的類,思想的轉變。
看完這兩篇文章以后,我們看下如下的相關概念:
構造函數特點:
1.方法名稱與類名稱完全一樣。
2.構造函數沒有任何返回值,哪怕是void
3.構造函數的方法修飾符一般為public
當手動為類添加構造函數后,會覆蓋默認的那個無參數的構造函數。
快捷寫構造函數的方法:ctor兩下tab鍵。
構造函數可以被重載。(只要參數列表不同即可。)
構造函數補充問題:
通過反編譯器,我們發現:程序編譯的時候把我們在字段里面賦的值,放到了構造函數里面
this表示當前對象。
"類"也是一種數據類型,是一種自定義數據類型,可以通過類聲明該類類型的變量。
Teacher teacher = new Teacher("001", 10000);
Teacher t1;表示聲明了一個Teacher類型的變量 t1;
new Teacher();表示創建了一個Teacher對象。
兩句話連起來,這樣理解上面的代碼: 創建了一個Teacher對象【new Teacher("001", 10000);】,並將該對象賦值給了一個Teacher類型的變量teacher
下面我們用面向對象的思想做個簡易計算器:
首先看下,面向過程寫的計算器的思路:
圖一、簡易計算器
我們再來看下封裝之后的計算器的思路
圖二、封裝計算器
圖三、猜拳游戲啟動界面
猜拳游戲思路:
普通思維過程:我點擊按鈕的時候出石頭、剪刀或布用1,2,3分別來代表上面的三個符號。
系統出,也是1,2,3來代表,但是系統是隨機出的。
最后一判斷就行了。
上面的是普通的思維過程,現在用面向對象的方法來寫。
先想有幾個對象,在哪幾個類里面,這些對象有什么共同的特點
分出:電腦 玩家 裁判 三個類
怎么才能想到這三個類呢?
分析過程:
看到這個游戲后,參與游戲的有多少個對象呢?
看看這樣想行不行?有兩個人他們都出拳,我們把他們寫成一個類。同時看到有石頭、剪刀、布。我們寫成一個類。顯然像上面這么寫是不行的,因為具體的出拳不是游戲的參與者。由於兩個玩家的內部實現不一樣,所以,我們不能把他們寫到一個類里面。
大家再想一想,如果我把決定勝負的判斷寫到兩個參與游戲的玩家之一里面可不可以呢?當然是不可以的,因為這樣不公平了。
大家有沒有感覺上面的分析過程想不到呢?沒關系,慢慢來,
多做幾個項目就好了。
下面我們做個簡易版的猜拳游戲,如下圖:
圖四、簡易版猜拳游戲
首先寫好猜拳游戲的winform界面。
圖五、猜拳游戲的winform
按照我們的分析思路寫下代碼,首先我們需要寫一個玩家類。在這個類中有個接收用戶出拳的屬性。
還有個出拳的方法
這個方法有沒有參數和返回值呢?答案是有的,用戶點擊哪個按鈕就返回對應的值。所以,這個方法是有參數的。並且方法本身沒有決定權。
寫下電腦類
也是寫個屬性接收電腦的出拳結果。
想想這個方法有沒有參數,有沒有返回值?
這個方法中電腦是隨機出拳的,所以,沒有參數。有返回值。也是int。
圖六、Player
圖七、Computer
裁判類里面有個決定誰輸誰贏的方法。我們想一想這個方法有沒有參數,有沒有返回值?
答案是有參數的,參數就是玩家的選擇結果和電腦隨機的結果。
返回值我們用枚舉表示,這樣比較的方便。
在判斷的時候我們找找規律,如下所示:
裁判類分析過程
1 表示:石頭
2表示: 剪刀
3 表示:布
1》相等
平局
2》
在這塊找找規律:
用戶贏:
1 2 =-1
2 3=-1
3 1=2
if(user==1 && computer==2 ||
user==2&&computer==3 || user==3 &&
computer==1){
}
3》電腦贏
2 1 =1
3 2 =1
1 3 =-2
圖八、CaiPan
下面我們寫程序調用這個類。
實例化一個玩家類
調用寫好的方法,給它傳參,返回值是個整型int
實例化一個電腦類
調電腦的方法,注意:沒有參數,有返回值。
實例化一個裁判類
調裁判方法,傳入兩個參數,它的返回值類型是個枚舉類型,
所以我們定義一個枚舉來接收。
下面就是根據出拳結果顯示不同的內容。
判斷的過程已經在裁判類中完成了。
把玩家還有電腦的出拳結果也顯示出來。
在同一段代碼中,我們復制粘貼了兩次,大家想一想,這樣行么?根據變成的DRY原則:Don’t Repeat Yourself.
圖九、Form1
面向對象[oo]
oop面向對象編程(oop-> Object -Oriented Programming)
ooa 面向對象分析
ood 面向對象設計
ooad 面向對象分析與設計。
說到面向對象,我們想一想究竟什么是面向對象呢?
面向對象一種思維方式,把程序用現實生活模擬的方式。好處:讓程序更靈活,更有可拓展性。
怎么才能實現這點呢?通過多態的方式實現。
這個需要仔細的區思考。
類、對象
1.什么是類
1>類是對某一類型對象的抽象,其中包含了該類型對象共有的屬性和方法,類是抽象的。(如:醫生,老師,軍人)
2.什么是對象
2>對象是一個具體的事務,是某類的一個實例。對象是具體的。
3.類與對象的關系
類是由多個同類型對象抽象而來的,而對象在使用時需要通過類來產生new.
類是一種自定義數據類型,而為這種數據類型賦值,的結果就是該類型的對象。
Teacher t=new Teacher();
屬性:
get
{
}
set
{
}
由一個私有字段,與兩個公有的方法組成。
class Test
{
public Test()
{
Console.WriteLine("Hello World!");
}
}
Test t=new Test();
t.Test();
想想上面代碼的執行結果是什么?
圖十、構造函數問題
上面是知識點的回顧:
下面我們再看看做過的猜拳游戲的代碼簡化:
這里我們演示下如何將建在之前文件上的猜拳游戲加載到另一個文件上面吧。
圖十一、加載文件
我們發現執行代碼中,只有參數:石頭、剪刀、布不一樣。所以我們提取出來一個方法。
圖十二、猜拳簡化代碼第一步
圖十三、猜拳簡化代碼第二步
圖十四、猜拳簡化代碼第三步
當我們寫到這步,發現這些代碼都寫死了,所以,要再簡化一下子。
圖十五、猜拳簡化代碼點擊事件
我發現點這三個按鈕執行的代碼幾乎是一樣的,我不要點剪刀,和布的方法了。點石頭綁定到的是btnRock_Click這個方法上,我讓點剪刀的時候也綁定到這個方法上,點布也綁定到這個方法上面,現在我點剪刀,布,執行的都是點石頭這個方法。
這個時候我們發現運行之后,點布還是剪刀的時候運行的都是石頭的方法,那我們怎么解決這個問題呢?
圖十六、猜拳簡化代碼改變參數
有沒有發現這有兩個參數:object sender,EventArgs e.大家用過這兩個參數么?
圖十七、猜拳簡化代碼通過事件源知道當前點擊按鈕
在整個猜拳游戲中,用到了一些我們剛剛介紹的知識,當然如果有朋友有更好的方法的話,歡迎在我的博客下面留言。
作者近期文章列表:
C#基礎教程(完全免費,獻給代碼愛好者的最好禮物。注:本作者分享自己精心整理的C#基礎教程,無任何商業目的。 希望與更多的代碼愛好者交流心得,也請高手多多指點!!!) |
|
面向過程,面向對象中高級 | 面向過程,面向對象的深入理解一 |
winform基礎 | Winform基礎 |
winform中常用的控件 | |
面向過程 | 三種循環的比較 |
C#中的方法(上) | |
我們常見的數組 | |
面向對象 | 思想的轉變 |
C#中超級好用的類 | |
C#中析構函數和命名空間的妙用 | |
C#中超級好用的字符串 | |
C#中如何快速處理字符串 | |
值類型和引用類型及其它 | |
ArrayList和HashTable妙用一 | |
ArrayList和HashTable妙用二 | |
文件管理File類 | |
多態 | |
C#中其它一些問題的小節 | |
GDI+ | 這些年我收集的GDI+代碼 |
這些年我收集的GDI+代碼2 | |
HTML概述 | 你不能忽視的HTML語言 |
你不能忽視的HTML語言2精編篇 | |
你不能忽視的HTML語言3 |