1声明接口
C#中的接口是一种定义了一组方法、属性和事件的结构,但没有实现它们的代码。接口只定义了方法、属性和事件的名称、返回类型和参数列表。接口可以被类或结构实现,实现接口的类或结构必须实现接口中定义的所有成员。
interface IExampleInterface
{
void ExampleMethod();
int ExampleProperty { get; set; }
event EventHandler ExampleEvent;
}
上面的代码定义了一个名为IExampleInterface
的接口,其中包含一个无返回值的方法ExampleMethod
、一个整型属性ExampleProperty
和一个事件ExampleEvent
。
接口的实现可以通过在类或结构中使用implements
关键字来实现。下面是一个实现上述接口的类的示例:
2继承接口:
class ExampleClass : IExampleInterface
{
public void ExampleMethod() // 实现方法
{
Console.WriteLine("ExampleMethod called.");
}
private int exampleProperty;
public int ExampleProperty // 实现属性
{
get { return exampleProperty; }
set { exampleProperty = value; }
}
public event EventHandler ExampleEvent; // 实现事件
}
上面的代码定义了一个名为ExampleClass
的类,该类实现了IExampleInterface
接口中定义的所有成员。
在使用接口时,可以将实现接口的类或结构的实例分配给接口类型的变量。这使得可以使用接口中定义的成员来访问实现接口的类或结构的成员。下面是一个示例:
3实例化使用:
IExampleInterface example = new ExampleClass();
example.ExampleMethod();
example.ExampleProperty = 42;
example.ExampleEvent += new EventHandler(ExampleEventHandler);
上面的代码创建了一个ExampleClass
类的实例,并将其分配给一个类型为IExampleInterface
的变量。然后,可以使用接口中定义的方法、属性和事件来访问该实例的成员。
接口主要用于功能扩展:
namespace WindowsFormsApp1
{
public interface 连接
{
string connect();
}
public class 以太网 : 连接
{
public string connect()
{
return "以太网连接";
}
}
public class 串口 : 连接
{
public string connect()
{
return "串口连接";
}
}
public class 设备 : 连接
{
public 连接 连接1;
public string connect()
{
// return 连接1==null ? "设备连接" : 连接1.connect();
if (连接1 == null)
{
return "设备连接";
}
return 连接1.connect();
}
}
}
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
设备 设备1=new 设备();
以太网 以太网1=new 以太网 ();
串口 串口1 = new 串口();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//设备1.连接1 = 以太网1;
label1.Text = 设备1.connect();
}
private void button2_Click(object sender, EventArgs e)
{
设备1.连接1 = 以太网1;
}
private void button3_Click(object sender, EventArgs e)
{
设备1.连接1 = 串口1;
}
}
}
这种就相当于:设备可以随意替换模块。而设备操作的对象都是同一个,由于插入的模块不同,会出现不同的结果。
老司机路线:
模块都继承接口,主模块只需要实现默认接口:
public object RXs(string cmd)
{
throw new NotImplementedException();
}
主模块不需要写方法体。
子模块写特有业务方法体。
public object TXs(string cmd)
{
byte[] buffer = TxCMD(cmd);//准备报文 //去除空白 StringsToHexBytes
TXrs485_发送命令(buffer, cmd);
return 0;
}
这样就可以优雅的写代码:
B3伺服=协议modbus.接口=以太网;
B3伺服=协议modbus.接口=串口;
利用接口,可以很方便的组态。
以下是一个使用C#编写的接口Demo,其中包含了科大讯飞语音识别的最新接口(流式)的实现。
你只需要将其中的appid、apiKey、apiSecret改成自己申请的即可正常使用。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace SpeechRecognitionDemo
{
class Program
{
static void Main(string[] args)
{
string audioFile = @"D:\test.wav"; // 音频文件路径
string result = SpeechRecognition(audioFile); // 调用语音识别接口
Console.WriteLine(result); // 输出识别结果
Console.ReadKey();
}
static string SpeechRecognition(string audioFile)
{
string url = "http://api.xfyun.cn/v1/service/v1/iat"; // 语音识别接口地址
string appId = "your_appid"; // 应用ID
string apiKey = "your_apikey"; // 接口密钥
string apiSecret = "your_apisecret"; // 接口密钥
string curTime = Convert.ToString((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000); // 当前时间戳
string param = "{\"engine_type\":\"sms16k\",\"aue\":\"raw\"}"; // 接口参数
string xParam = Convert.ToBase64String(Encoding.UTF8.GetBytes(param)); // Base64编码后的接口参数
string fileData = Convert.ToBase64String(File.ReadAllBytes(audioFile)); // Base64编码后的音频文件数据
string checkSum = MD5(apiKey + curTime + xParam + fileData); // 计算接口校验和
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
request.Headers.Add("X-Appid", appId);
request.Headers.Add("X-CurTime", curTime);
request.Headers.Add("X-Param", xParam);
request.Headers.Add("X-CheckSum", checkSum);
using (Stream stream = request.GetRequestStream())
{
byte[] data = Encoding.UTF8.GetBytes("audio=" + fileData);
stream.Write(data, 0, data.Length);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
return reader.ReadToEnd();
}
}
static string MD5(string input)
{
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(input);
bytes = md5.ComputeHash(bytes);
StringBuilder result = new StringBuilder();
foreach (byte b in bytes)
{
result.Append(b.ToString("x2"));
}
return result.ToString().ToUpper();
}
}
}