美文网首页
46.C# 接口

46.C# 接口

作者: 技术老小子 | 来源:发表于2024-03-15 05:51 被阅读0次

    摘要


    C#接口定义了所有类继承接口时应遵循的语法约定。接口定义了语法约定 "是什么" 部分,派生类定义了语法约定 "怎么做" 部分。

    正文


    接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。抽象类在某种程度上与接口类似,但是,它们大多是由基类的派生类。

    1.接口本身并不实现任何功能。

    2.抽象类不能直接实例化。

    image.png

    定义接口语法:

    接口命名通常以 I 字母开头,例如IAction。

    public interface IAction
    {
        bool Start();
        bool Stop();
    }
    
    

    接口成员,不允许使用 public、private、protected、internal 访问修饰符,不允许使用 static、virtual、abstract、sealed 修饰符。不能定义字段,定义的方法不能包含方法体。

    定义一个Material 接品

    public interface IMaterial
    {
        string Name { get; set; }
    
        string Mlfb { get; set; }
    
        bool Start();
        bool Stop();
    }
    
    

    实现

    接口的实现与类的继承语法格式类似,就是重写了接口中的方法。

    定义一个Plc类,继承了接口

    internal class Plc : IMaterial
    {
        public string Name { get; set; }
        public string Mlfb { get; set; }
    
        public bool Start()
        {
            Console.WriteLine($"{this.Name} Start");
            return true;
        }
    
        public bool Stop()
        {
            Console.WriteLine($"{this.Name} Stop");
            return true;
        }
    }
    
    

    调用

    //通过类声明
    Equipment equipment=new Equipment();
    equipment.Name = "S7-1200";
    equipment.Start();
    equipment.Stop();
    
    //通过接口声明
    IMaterial equipment1 = new Equipment();
    equipment1 .Name = "S7-1500";
    equipment1 .Start();
    equipment1 .Stop();
    
    
    image.png

    多态

    使用接口实现多态 需要满足以下两个条件。

    定义接口并使用类实现了接口中的成员。

    创建接口的实例指向不同的实现类对象。

    再定义一个Motor类,同样继承IMaterial接口

    internal class Motor : IMaterial
    {
        public string Name { get; set; }
        public string Mlfb { get; set; }
    
        public bool Start()
        {
            Console.WriteLine($"{this.Name} Start");
            return true;
        }
    
        public bool Stop()
        {
            Console.WriteLine($"{this.Name} Stop");
            return true;
        }
    }
    
    

    调用

    //通过接口声明
    IMaterial material1 = new Plc();
    material1.Name = "S7-1500";
    material1.Start();
    material1.Stop();
    
    //通过接口声明
    IMaterial material2 = new Motor();
    material2.Name = "S120";
    material2.Start();
    material2.Stop();
    
    
    image.png

    修改Plc类,将两个方法设置成virtual

    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();
    
    
    image.png

    抽像类与接口区别

    • 抽象类可以有实例成员,接口则不能。
    • 抽象类不能多继承,接口还是可以的。
    • 抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。
    • 抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。
    • 此外接口不能包含字段、构造函数、析构函数、静态成员或常量。(在新的版本中已经不是绝对的了,C# 8.0后可以用static成员了)

    相关文章

      网友评论

          本文标题:46.C# 接口

          本文链接:https://www.haomeiwen.com/subject/cafgzdtx.html