47.C# 接口的进阶
2024-03-16 本文已影响0人
技术老小子
摘要
我们这里主要再讨论一下,C#8.0以后接口的变化,你会发现我们对接口的一些定义发生了变化,再有我们会写一个接口多继承的例子,这些在实际业务有都有用到。
正文
C#8.0后的变化
默认接口方法
再次修改IMaterial
public interface IMaterial
{
string Name { get; set; }
string Mlfb { get; set; }
bool Start();
bool Stop();
//默认接口方法
void ReadValue(string Address)
{
Console.WriteLine(Address + "读数据");
}
}
创建一个Plc类
internal class Plc : IMaterial
{
public string Name { get; set; }
public string Mlfb { get; set; }
//申明成虚方法
public virtual bool Start()
{
Console.WriteLine($"{this.Name} Start");
return true;
}
public virtual bool Stop()
{
Console.WriteLine($"{this.Name} Stop");
return true;
}
}
再创建一个S71200类
internal class S71200 : Plc
{
public override bool Start()
{
Console.WriteLine("我是1200,运行中...");
return true;
}
}
调用,这样也是可以的了,是不是有点懵了,这不根抽像类越来越像了
//通过接口声明
IMaterial material3 =new S71200();
material3.Name = "1217";
material3.Start();
material3.Stop();
material3.ReadValue("DB0.0");
image.png
静态类
//再来一个读取数据
static int ReadQty { get; set; }
调用
//通过接口声明
IMaterial material1 = new Plc();
material1.Name = "S7-1500";
material1.Start();
material1.Stop();
material1.ReadValue("DB0.0");
//通过接口声明
IMaterial material2 = new Motor();
material2.Name = "S120";
material2.Start();
material2.Stop();
material1.ReadValue("DB0.0");
//通过接口声明
IMaterial material3 =new S71200();
material3.Name = "1217";
material3.Start();
material3.Stop();
material3.ReadValue("DB0.0");
Console.WriteLine(IMaterial.ReadQty);
image.png
多继承
类只能继承一个类,不能继承多个类,但可以继承多个接口Interface。
定义一个IBusiness接口
internal interface IBusiness
{
void Sell();
void Purchase();
}
修改S71200类
internal class S71200 : Plc, IBusiness
{
public void Purchase()
{
IMaterial.ReadQty++;
Console.WriteLine("买了一个1200!");
}
public void Sell()
{
IMaterial.ReadQty--;
Console.WriteLine("卖了一个1200!");
}
public override bool Start()
{
Console.WriteLine("我是1200,运行中...");
return true;
}
}
调用
//通过接口声明
IMaterial material1 = new Plc();
material1.Name = "S7-1500";
material1.Start();
material1.Stop();
material1.ReadValue("DB0.0");
//通过接口声明
IMaterial material2 = new Motor();
material2.Name = "S120";
material2.Start();
material2.Stop();
material1.ReadValue("DB0.0");
//通过接口声明
IMaterial material3 =new S71200();
material3.Name = "1217";
material3.Start();
material3.Stop();
material3.ReadValue("DB0.0");
((S71200)material3).Purchase();
Console.WriteLine(IMaterial.ReadQty);
((S71200)material3).Sell();
Console.WriteLine(IMaterial.ReadQty);
image.png