上一篇主要讲了面向对象抽象类的实际项目的应用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 }
题外话:
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 那个标准
是不是感觉抽象类很有用,假如以后追加 其它格式 只需增加相应的子类功能。