資源描述:
《實例詳解C#抽象類及其用法》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在教育資源-天天文庫。
1、實例解析C#抽象類近來有很多童鞋問我有關抽象類的問題,很多初學者不明白為什么要有抽象類,什么情況下使用抽象類。網(wǎng)上搜了下,還真的沒多少文章講此類問題,那么我就在這里簡單講下,鑒于各類書籍、論壇、帖子上有關C#抽象類的語法現(xiàn)象解釋的已經(jīng)足夠清楚了,我在這里就只說下抽象類在什么情況下用,舉幾個例子,并總結了一些C#抽象類的注意要點,供大家參考。我想大家都打過CS吧?。ㄊ裁?,沒打過?拖出去)假如我們現(xiàn)在要開發(fā)一個模擬CS的游戲。我們的業(yè)務很簡單,要求如下:1、游戲中要有恐怖分子,一個恐怖分子一次只能持有一支槍2、游戲中有多種槍支3
2、、恐怖分子可以選擇槍支使用4、恐怖分子可以開槍殺人僅此4條,為了使程序足夠簡單,能說明我們主要目標就行,所以我們用控制臺程序來模擬實現(xiàn)。方法1我們先來看第一種實現(xiàn)情況,假設,游戲中現(xiàn)在有手槍(Pistol)和步槍(Rifle),那么我們必然需要有對應的兩個槍械的類。//手槍類publicclassPistol{publicvoidShoot(){Console.WriteLine("手槍開始射擊:叭叭叭");}}//步槍類publicclassRifle{publicvoidShoot(){Console.WriteLine
3、("步槍開始射擊:噠噠噠。。");}}有了槍械,就可以來實現(xiàn)游戲中的恐怖分子了。業(yè)務清單中有一條,匪徒可以選擇所用槍支,那么,我們的類可能就需要實現(xiàn)為下邊的情況。//恐怖分子類publicclassTerrorist{privatePistolpistol;privateRiflerifle;publicvoidSetGun(objectgun)//換槍{if(gunisPistol){pistol=(Pistol)gun;//只能拿一支槍,在拿手槍的同時,rifle=null;要讓步槍為null}else{rifle=(R
4、ifle)gun;pistol=null;}}publicvoidKillEnemy(){Console.WriteLine("恐怖分子開始殺人!");if(rifle==null){pistol.Shoot();}else{rifle.Shoot();}}}如果運行游戲,還需要有個表示層。我們這樣來調(diào)用這寫類:classProgram{staticvoidMain(string[]args){TerroristlaDeng=newTerrorist();//new出來一個拉登laDeng.SetGun(newPistol(
5、));//給他一支手槍laDeng.KillEnemy();//拉登開槍laDeng.SetGun(newRifle());laDeng.KillEnemy();}}好了,程序?qū)懙竭@里就基本實現(xiàn)了我們的業(yè)務要求,我們來分析下程序的結構關系,類圖是個好的工具,我已經(jīng)畫出來了,請看。其中,帶減號“-”的表示是private的,加號“+”的表示是public的。我們可以發(fā)現(xiàn)Terrorist和兩個槍支類Rifle以及Pistol是一種依賴關系。那么這樣實現(xiàn)我們的控制臺版的CS游戲好不好呢?Absolutely不好!??!假如,游戲上
6、線1個月,我們需要更新槍支來吸引新老玩家,我們想要增添一款狙擊步槍AWP。好吧,我是一個OO程序員,這難不倒我,我只需要添加一個AWP類:publicclassAWP{publicvoidShoot(){Console.WriteLine("AWP開始射擊:啪。一槍斃敵");}}然后我們需要修改下Terrorist類,添加一個private字段AWP,然后修改SetGun()方法,我們需要讓if…else變的更長。接下來,還要修改KillEnemy。還是if…else。。。假如,又過了一個月,我們又想添加一款沖鋒槍M4A1。
7、那么,添加類,修改Terrorist。假如,又過了一個月。。。。。Ohmygodness?。。∧銡⒘宋野?。你會發(fā)現(xiàn),你的代碼在不停的修改,如果哪一款槍械決定刪除了,簡直要被逼瘋了。那么,好吧,我決定使用抽象類試試方法2思考上一個方法,我們的麻煩來自于哪里呢?來自于每一種槍械都是一個單獨的類,她們之間沒有任何關聯(lián)關系,這就使得我們匪徒類Terrorist必須有各個槍械類型的引用字段,但是。。。業(yè)務要求Terrorist一次只能用一支槍。那么,如果我們能用一個字段來保留這些槍支的引用就好了。我們設計一個抽象的搶類,讓所有的槍械都
8、繼承于這個抽象的槍類本著這個思路,我們先畫一張新方法的類圖。接下來就是代碼實現(xiàn)了。我們先來設計抽象類AbstractGun。publicabstractclassAbstractGun{publicabstractvoidShoot();}這里代碼非常簡單,抽象類AbastractGun只