序言
今天主要写一下之前看到接口可以实现播放器插件扩展上的应用,原理简单,但是适合初学者理解接口的原理和使用,也完成下一直想试试的愿望吧,呵呵
先简单说下接口吧
接口描述的是可属于任何 类或 结构的一组相关功能。 接口可由方法、属性、事件、索引器或这四种成员类型的任意组合构成。接口不能包含字段。接口成员一定是公共的。当类或结构继承接口时,意味着该类或结构为该接口定义的所有成员提供实现。接口本身不提供类或结构能够以继承基类功能的方式继承的任何功能。但是,如果基类实现接口,派生类将继承该实现。
接口可是不能被实例化的,这也是和类的区别之一,在继承接口时可以继承多个接口,但是在继承类的时候,只能继承一个类。接口中的方法都不需要提供实现的,和抽象类有相似有不同,抽象类中可以定义的东东比接口多哦,比如字段啊,方法--多看看msdn吧
不扯了,直接上程序,仔细理解o
项目截图
配置文件app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="MP4" value="JieMaMP4"/>
<add key="AVI" value="JieMaAVI"/>
</appSettings>
</configuration>
主程序
using ConsoleApplication1.JieM;
using System;
namespace ConsoleApplication1
{
/// <summary>
/// 实现扩展解码插件的接口,新的解码方案要实现这个接口
/// 而且将相应的类放到JieM文件夹下
/// 而且在app.config中添加相应的 新视频格式(大写) 和 对应的类名
/// </summary>
interface JieMa_Interface
{
/// <summary>
/// 这里进行模拟解码
/// </summary>
/// <param name="movie">输入模拟的视频信息,其实把视频信息封装成类会更好</param>
/// <returns>返回模拟的解码流</returns>
string JieMa(string movie);
}
class Program
{
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("输入文件的名称,加后缀,用点分开");
//1.获得名字,带后缀名
string movie = Console.ReadLine();
string[] name = movie.Split('.');
//2.获得后缀的大写
string slib = name[1].ToUpper();
//3.从配置文件中获得相应后缀对应的类名 加上默认命名空间名字
string classType = System.Configuration.ConfigurationManager.AppSettings[slib];
if (string.IsNullOrEmpty(classType))
{
Console.WriteLine("抱歉,目前不支持这种视频格式,请下载相应的解码插件");
continue;
}
classType = "ConsoleApplication1.JieM." + classType;
//4.反射 获得类型
Type t = Type.GetType(classType);
//5.反射 产生相应的实例 使用接口接受(这里接口的优势就体现了)
JieMa_Interface letUsJieMa = Activator.CreateInstance(t) as JieMa_Interface;
//6.下面 调用解码方法,进行解码
string resultStr = letUsJieMa.JieMa(name[0]);
//7.模拟输出
Console.WriteLine(resultStr);
Console.WriteLine("---------------------------------------------");
}
}
}
}
用于解码的类集合
-----------------------------------JieMaMP4.cs-------------------------------------------
using System;
using System;
namespace ConsoleApplication1.JieM
{
public class JieMaMP4 : JieMa_Interface
{
string JieMa_Interface.JieMa(string movie)
{
return "这里可以处理mp4格式的电影,返回可以处理的码流," + movie;
}
}
}
-----------------------------------JieMaMP4.cs-------------------------------------------
-----------------------------------JieMaAVI.cs-------------------------------------------
using System;
namespace ConsoleApplication1.JieM
{
public class JieMaAVI:JieMa_Interface
{
string JieMa_Interface.JieMa(string movie)
{
return "这里可以处理avi格式的电影,返回可以处理的码流," + movie;
}
}
}
-----------------------------------JieMaAVI.cs-------------------------------------------
结果
总结
呵呵,随便说几句吧,这里用到了反射,刚学习的同学们可能有点不理解,没关系,理解下我的注释,具体反射是什么,我后面会写文章来介绍的,有兴趣可以来看看,其实我学得也不久,大家一起学习。没有人敢说自己的程序一定正确,欢迎大家发现问题,有问题,留言给我,毕竟文章写出来,万一有错误,会误导别人了,谢谢啊。关于我写的程序有问题的也可以留言,对了这里的重点是接口的使用,播放器的解码插件具体怎么实现,我也不知道,O(∩_∩)O哈哈~。有兴趣的朋友,接口的设计方面,和抽象类的区别,接口和类的区别,接口和抽象类的区别,三者之间的选择,都是值得学习的方面,大家有兴趣可以去看看资料。