zoukankan      html  css  js  c++  java
  • 面向对象抽象类的实际项目的应用(C#篇)

    简介

    上一篇主要讲了面向对象抽象类的实际项目的应用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 }

    题外话:

    1. Java 代码  public abstract void Play() throws Exception;
       
    2. 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) 

    方法的返回值为什么要采用布尔型。是因为 播放成功与否就二个状态

    1. 播放成功,不用提示用户。播放相应的视频就可以。播放成功,不用提示用户。播放相应的视频就可以。
    2. 播放失败 需要提示用户。

    举例说明

    你让你朋友帮你抢小米手机,抢到以后再给他钱。结果出现下面二种情况你会选择那种情况。

    1. 当没有抢到的时候,你同事给你挂电话。告诉你手机没有抢到。
    2. 没有抢到的时候,你同事不给你任何消息。等一个月以后,你打电话的时候,告诉你没有抢到。

    我想大家肯定会选择第一种。我们做程序一定要站在用户的角度考虑问题。所以要加一个播放成功与否的状态。

    FileExtension = FileName.Substring(FileName.IndexOf(".") + 1);

    获取文件名扩展名的方法。这个随便。我只是随便写了一个,你可能有更好的实现办法。总之实现了就可以。

    正常这块也应该加一个单独的异常。获取文件名扩展名是最容易出错的地方。因为不可能每一个文件名称都像 001.avi 那个标准

    是不是感觉抽象类很有用,假如以后追加 其它格式 只需增加相应的子类功能。

    声明如下

    1. 学会用抽象的面向对象思想解决问题,是作为程序员一个良好的习惯。
    2. 技术无止境,学习无止境。我只是起到一个入门和抛砖引玉的作用。
    3. 因为本人有很多的工作要做。写这个主要是利用业余时间。难免代码有错误的地方。或文字上有错别字。还是这句话,写这些主要是教大家如何学习。理论掌握了,语言只是工具。谢谢大家在百忙之中观看此文。
    4. 文中代码实现,已经测试过:
    5. 我写的内容可以随便转载,欢迎大家转载。
  • 相关阅读:
    NHibernate版本不一致问题
    .NET中AOP的几种实现方案
    转播
    看来不得不来谈谈这个首页精华区了
    事件与委托
    关于字符集和字符编码以及代码页的前前后后(续)
    让电脑像人脑一样思考,谁养鱼问题断言推理解法
    关于那个脑袋的很漂漂的图形的C#版本
    大家都有头像,我来测试下我的新头像。
    浅谈JavaScript中的对象和类型(上)
  • 原文地址:https://www.cnblogs.com/littlestone/p/4304907.html
Copyright © 2011-2022 走看看