【从头构筑C#知识体系】1.3 接口

【系列文章目录】



前言

本篇介绍结构体

【C#文档——接口】


一、接口的作用

先看看【C#文档——接口】中的定义吧

接口包含非抽象 class 或 struct 必须实现的一组相关功能的定义。

结合定义及使用经验,我觉得接口有以下作用

  • 设计类或结构体

  • 设计外部关注点

二、接口的特点

接口包含以下特点:

  • 接口的成员

    • 事件

    • 索引器

    • 方法

    • 属性

  • 接口本身是抽象的

    接口与抽象类类似,不能被实例化
  • 接口只有抽象成员

    接口与抽象类的不同点,接口定义的时候不可以包含实现
  • 实现接口的任何类或结构体必须实现接口成员

    接口的作用是设计,设计之后当然需要实现
  • 一个类或结构体可以实现多个接口

    基于这个特性,我们在接口设计上,可以做到每个接口的功能都是单一的
    根据接口隔离原则,我们也确实应该让每个接口功能尽量少
    在定义一个类或结构体时,用多个小结构来组合,而不是用一个非常巨大的接口

三、接口的实现

  • 隐式实现

    这是一种常见的接口实现方式

    public interface ICanRun{
          
          
    	public void Run();
    }
    
    public class Cat : ICanRun{
          
          
    	public void Run(){
          
          
    		//具体逻辑
    		//...
    	}
    }
    
  • 显示实现

    显示实现比较不常见

    public interface ICanRun{
          
          
    	public void Run();
    }
    
    public class Cat : ICanRun{
          
          
    	public void ICanRun.Run(){
          
          
    		//具体逻辑
    		//...
    	}
    }
    
    • 显示实现的作用
      以上两种方式都可以实现一个接口

      而隐式实现写法简单,我们为什么要使用显示实现呢?

      按照官方的说法是

      接口的显示实现可以解决接口方法可能重名的问题

      然而事情并没有表面上这么简单

      接口的显示实现还有许多妙用

      首先我们需要知道:

      当一个接口方法为显示实现时,需要通过以这个接口类型来调用

      举个例子

      //当显示实现了ICanRun中的Run()时,这样写是错误的
      Cat pipi = new Cat();
      pipi.Run();
      
      //不论是否显示实现,这样写都是正确的
      ICanRun pipi = new Cat();
      pipi.Run();
      

      通过以上两个例子,我们可以总结接口显示实现的特殊用途:

      • 强制使用者通过关注接口来调用方法

      • 让使用者无法关注到显示实现的方法

      上面两个用途,其实都属于同一个特点,只是用途不同而已


思维导图

接口
接口的作用
接口的特点
接口的实现
设计数据结构
设计外部关注点
接口的成员
事件
索引器
方法
属性
接口本身是抽象的
接口只有抽象成员
实现接口的任何类或结构体必须实现接口成员
一个类或结构体可以实现多个接口
隐式实现
显示实现
强制使用者通过关注接口来调用方法
让使用者无法关注到显式实现的方法

猜你喜欢

转载自blog.csdn.net/ruanlinxi1994/article/details/125435531