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
上一篇下一篇

猜你喜欢

热点阅读