Learning hard C#学习笔记——读书笔记 04

  • Learning hard C#学习笔记——读书笔记 04已关闭评论
  • 201 次浏览
  • A+
所属分类:.NET技术
摘要

接口可以认为是一种规范,它是一种类的构建规范,它里面定义了一系列的方法和类型,但是没有具体的实现,需要继承它的类去自我实现


1.什么是接口

接口可以认为是一种规范,它是一种类的构建规范,它里面定义了一系列的方法和类型,但是没有具体的实现,需要继承它的类去自我实现

2.接口的定义

使用 VS2022 在解决方案管理器这里,添加新建项

Learning hard C#学习笔记——读书笔记 04

在添加新建项模板这里,选择接口

Learning hard C#学习笔记——读书笔记 04

最后创建出来的接口如下

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;  namespace classTest {     internal interface Interface1     {     } } 

接口的注意点

  1. 在接口中定义的方法不能添加任何的修饰符,接口的方法默认是 public
  2. 在接口中可以定义属性、事件、索引器、方法,或者这四类成员的任意组合,但是接口不能包含字段、运算符重载、实例构造函数和析构函数
  3. 接口的所有成员默认都是公共的,不能用public、private、protected来修饰,也不能用static修饰

3.实现接口

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;  namespace classTest {     public class Person : ICustomCompare     {         int age;          public int Age { get { return age; } set { age = value; } }            public int compareTo(object other)         {             if (other == null) {                 return 1;             }              // 这里强制类型转换一手             Person value = (Person)other;             if (value.age > this.age)              {                 return -1;             }             else             {                 return 1;             }              return 0;         }     } }  
using classTest;  class Program {     static void Main(string[] args)     {         Person p1 = new Person();         p1.Age = 10;          Person p2 = new Person();         p2.Age = 20;          if (p1.compareTo(p2) > 0)         {             Console.WriteLine("p1 > p2");         }         else if (p1.compareTo(p2) < 0)         {             Console.WriteLine("p1 > p2");         }         else {             Console.WriteLine("一样大");         }     }  }  

Learning hard C#学习笔记——读书笔记 04

4.显式的实现接口

之前我们的实现方式是隐式的实现接口的方式,即没有指出是哪个接口的compareTo()方法

而现在是显式的实现方式

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;  namespace classTest {     internal interface ICustomCompare     {         int compareTo(object other);     }      // 中国人打招呼的方式     internal interface IChineseGreeting      {         void sayHello();     }      // 美国人打招呼的方式     internal interface IAmericanGreeting {         void sayHello();     } }  

我们可以发现,上面的代码中,IChineseGreeting、IAmericanGreeting这两个接口,都有sayHello方法,当我们有一个类去实现两个接口的时候,会出现一个问题,就是,我们到底是在实现IChineseGreeting的sayHello()方法,还是在实现IAmericanGreeting的sayHello()方法,还是同时实现?

Learning hard C#学习笔记——读书笔记 04

最后我们发现是两个接口的实现方式都一样,但是如果,我们想要有不同的实现方式,就需要显式的实现接口

下面这种方式就是显式的实现接口

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;  namespace classTest {     internal class Speaker : IAmericanGreeting, IChineseGreeting     {         // 显式的实现接口         void IChineseGreeting.sayHello()         {             Console.WriteLine("你好");         }          void IAmericanGreeting.sayHello()         {             Console.WriteLine("Hello");         }     } } 

显式实现接口的注意点

  • 若显式实现接口,方法不能使用任何的访问修饰符,显式实现的成员都默认为私有
  • 显式实现的成员默认都是私有的,这些成员都不能通过类的对象进行访问

5.显式/隐式实现接口的场景

  1. 采用隐式接口实现时,类和接口都可以访问接口中的方法,而采用显式实现接口,接口的方法只能通过接口来访问,因为此时接口的方法默认为私有
  2. 当类实现单个接口时,通常使用隐式接口实现
  3. 当类实现多个接口时,并且接口的方法名称、参数和返回类型都相同的时候,则应该使用显式接口实现

6.接口与抽象类

接口与抽象类的区别主要有以下几点

  1. 抽象类使用 abstract 关键字定义,而接口使用 interface 进行定义;它们都不能进行实例化
  2. 抽象类中可以包含虚方法、非抽象方法、和静态成员,接口中不能包含虚方法和任何的静态成员,并且接口中只能定义方法,不能有具体实现,方法具体由实现类来完成
  3. 抽象类不能实现多继承,接口支持多实现
  4. 抽象类是对一类对象的抽象,继承与抽象类与抽象类为属于的关系;而类实现接口,只是代表实现类具有接口声明的方法,是一种Can-do的关系,所以接口后一般带有able的字段,表示能做