C#接口的使用interface

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();
        }
    }
}


 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值