簡介
上一篇主要講了面向對象抽象類的實際項目的應用Java代碼的寫法。今天閑來無事,在寫一篇C#代碼的寫法。語言只是工具。理論掌握了用什么語言開發,要看具體的項目而定。
項目需求:
模擬開發一個播放視頻的萬能播放器的功能。可以播放AVI、MPEG、RMVB 對這三種格式的視頻播放。
例如:001.avi 自動選擇播放AVI格式的功能 001.mpeg 自動選擇播放MPEG格式的功能 001.rmvb 自動選擇播放RMVB格式的功能
其它格式,提示用戶。此文件格式不能進行播放。具體播放功能可以不用實現。可以用信息來代替。
需求分析:
通過上面的內容我們知道面向對象的主體是播放器(面向對象開發主要就是在需求中找到相應的對象)方法體是播放視頻功能,實現的功能是(播放xxxxxx格式視頻)具體功能不用實現。只是模擬一下播放的過程。
通過上面分析 抽象類 :播放器 抽象方法 :播放功能
子類 Avi、Mpeg、RMVB
思路清晰了,下面開始編寫代碼。
下面是代碼實現,已經測試過:
定義抽象類PlayerHelper:
1 using System; 2 using System.Linq; 3 using System.Text; 4 using System.Collections.Generic; 5 6 namespace com.PlayerHelper 7 { 8 public abstract class PlayerHelper 9 { 10 public string FileName { set; get; } 11 12 public PlayerHelper(string FileName) 13 { 14 this.FileName = FileName; 15 } 16 17 public abstract void Play(); 18 } 19 }
題外話:
- Java 代碼 public abstract void Play() throws Exception;
- C#代碼 public abstract void Play();
Java的異常分為Runtime Exception和Caught Exception,
RuntimeException不需要顯式聲明throws語句, 但Caught Exception必須顯式聲明throws或則被catch.
.net的異常處理機制稍有不同, .net沒有java里所謂的Caught Exception,
因為.net認為Exception是異常, 是無法預知的, 能預知的Exception應該在發生后就該被fix, 而不是catch處理. 理念不同.
定義子類Avi:
1 using System; 2 using System.Linq; 3 using System.Text; 4 using System.Collections.Generic; 5 6 namespace com.PlayerHelper 7 { 8 public class Avi : PlayerHelper 9 { 10 public Avi(string FileName) 11 : base(FileName) 12 { 13 14 } 15 16 public override void Play() 17 { 18 try 19 { 20 Console.Write("播放AVI格式視頻"); 21 Console.ReadKey();//獲取用戶按下的下一個字符或功能鍵。 按下的鍵顯示在控制台窗口中。 22 } 23 catch 24 { 25 throw new Exception(); 26 } 27 } 28 } 29 }
定義子類Mpeg:
1 using System; 2 using System.Linq; 3 using System.Text; 4 using System.Collections.Generic; 5 6 namespace com.PlayerHelper 7 { 8 public class Mpeg : PlayerHelper 9 { 10 public Mpeg(string FileName) 11 : base(FileName) 12 { 13 14 } 15 16 public override void Play() 17 { 18 try 19 { 20 Console.Out.Write("播放MPEG格式視頻"); 21 Console.ReadKey();//獲取用戶按下的下一個字符或功能鍵。 按下的鍵顯示在控制台窗口中。 22 } 23 catch 24 { 25 throw new Exception(); 26 } 27 } 28 } 29 }
定義子類Rmvb:
1 using System; 2 using System.Linq; 3 using System.Text; 4 using System.Collections.Generic; 5 6 namespace com.PlayerHelper 7 { 8 public class Rmvb : PlayerHelper 9 { 10 public Rmvb(string FileName) 11 : base(FileName) 12 { 13 14 } 15 16 public override void Play() 17 { 18 try 19 { 20 Console.Write("播放RMVB格式視頻"); 21 } 22 catch 23 { 24 throw new Exception(); 25 } 26 } 27 } 28 }
定義子類PlayerManagement
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace com.PlayerHelper 7 { 8 public class PlayerManagement 9 { 10 public PlayerHelper playerhelper; 11 12 public bool Player(String FileName) 13 { 14 string FileExtension = ""; 15 FileExtension = FileName.Substring(FileName.IndexOf(".") + 1); 16 17 if (FileExtension != "" || null != FileExtension) 18 { 19 switch (FileExtension.ToUpper()) 20 { 21 case "AVI": 22 playerhelper = new Avi(FileName); 23 break; 24 case "MPEG": 25 playerhelper = new Mpeg(FileName); 26 break; 27 case "RMVB": 28 playerhelper = new Rmvb(FileName); 29 break; 30 default: 31 return false; 32 } 33 try 34 { 35 playerhelper.Play(); 36 } 37 catch (Exception ex) 38 { 39 throw new Exception(ex.ToString()); 40 } 41 return true; 42 } 43 else 44 { 45 return false; 46 } 47 } 48 } 49 }
測試方法
1 using System; 2 using System.Linq; 3 using System.Text; 4 using System.Collections.Generic; 5 6 namespace com.PlayerHelper 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 bool bolTemp = false; 13 PlayerManagement pm = new PlayerManagement(); 14 try 15 { 16 bolTemp = pm.Player("001.avi"); 17 if (bolTemp == false) 18 { 19 Console.Write("此文件格式不能進行播放"); 20 Console.ReadKey();//獲取用戶按下的下一個字符或功能鍵。 按下的鍵顯示在控制台窗口中。 21 } 22 } 23 catch (Exception ex) 24 { 25 Console.Write(ex.ToString()); 26 Console.ReadKey();//獲取用戶按下的下一個字符或功能鍵。 按下的鍵顯示在控制台窗口中。 27 } 28 } 29 } 30 }
代碼功能解析
public boolean Player(String FileName)
方法的返回值為什么要采用布爾型。是因為 播放成功與否就二個狀態
- 播放成功,不用提示用戶。播放相應的視頻就可以。播放成功,不用提示用戶。播放相應的視頻就可以。
- 播放失敗 需要提示用戶。
舉例說明
你讓你朋友幫你搶小米手機,搶到以后再給他錢。結果出現下面二種情況你會選擇那種情況。
- 當沒有搶到的時候,你同事給你掛電話。告訴你手機沒有搶到。
- 沒有搶到的時候,你同事不給你任何消息。等一個月以后,你打電話的時候,告訴你沒有搶到。
我想大家肯定會選擇第一種。我們做程序一定要站在用戶的角度考慮問題。所以要加一個播放成功與否的狀態。
FileExtension = FileName.Substring(FileName.IndexOf(".") + 1);
獲取文件名擴展名的方法。這個隨便。我只是隨便寫了一個,你可能有更好的實現辦法。總之實現了就可以。
正常這塊也應該加一個單獨的異常。獲取文件名擴展名是最容易出錯的地方。因為不可能每一個文件名稱都像 001.avi 那個標准
是不是感覺抽象類很有用,假如以后追加 其它格式 只需增加相應的子類功能。
聲明如下
- 學會用抽象的面向對象思想解決問題,是作為程序員一個良好的習慣。
- 技術無止境,學習無止境。我只是起到一個入門和拋磚引玉的作用。
- 因為本人有很多的工作要做。寫這個主要是利用業余時間。難免代碼有錯誤的地方。或文字上有錯別字。還是這句話,寫這些主要是教大家如何學習。理論掌握了,語言只是工具。謝謝大家在百忙之中觀看此文。
- 文中代碼實現,已經測試過:
- 我寫的內容可以隨便轉載,歡迎大家轉載。