c#中 类之间的继承关系仅支持单重继承,而接口是为了实现多重继承关系设计的。一个类能同时实现多个接口,接口之间也可以继承。
接口包含非抽象类 或 结构体 必须实现的一组相关功能的定义。
接口可以定义 static 方法,此类方法必须具有实现。
接口可为成员定义默认实现。
接口不能声明实例数据, 如字段、自动实现的属性或类似属性的事件。
可使用 interface 关键字定义接口,如以下示例所示。
interface IEquatable<T> { bool Equals(T obj); }
接口命名通常以 I 字母开头,接口成员,不允许使用 public、private、protected、internal 访问修饰符
接口可以包含实例方法、属性、事件、索引器或这四种成员类型的任意组合。 接口可以 包含静态构造函数、字段、常量或运算符。
接口的实现:
/// <summary> /// 定义一个接口 /// </summary> /// <typeparam name="T">泛型类型参数 T</typeparam> interface IEquatable<T> { //定义子类必须实现的方法 bool Equals(T obj); } /// <summary> /// 定义一个类继承接口 /// </summary> public class Car : IEquatable<Car> { //子类的属性 public string? Make { get; set; } public string? Model { get; set; } public string? Year { get; set; } /// <summary> /// 显性实现接口 /// </summary> /// <param name="obj"></param> /// <returns></returns> bool IEquatable<Car>.Equals(Car obj) { return (this.Model, this.Make, this.Year) == (obj.Model, obj.Make, obj.Year); } }
接口的调用:
///定义对象 Car car1 = new Car(); //定义一个用于比较的对象 Car car2 = new Car(); //接口无法直接进行实例化。 其成员由实现接口的任何类或结构来实现。 IEquatable<Car> car11 = car1; //赋值 car1.Make = "New Make"; car1.Year = "2023"; car1.Model = "New Model"; car2.Make = "New Make"; car2.Year = "2023"; car2.Model = "New Model"; //调用接口中我们定义的方法 if (car11.Equals(car2)) { //一般情况下,两个对象使用Equals时 //因为Equals是Object中的一个虚方法,会返回false //我们在接口中定义了自己的方法,会返回True Console.WriteLine("相同"); } else { Console.WriteLine("不相同"); } Console.ReadKey();
利用接口实现多态:
interface ICarEquatable<T> { //定义子类必须实现的方法 bool Equals(T obj); void Run(); } /// <summary> /// 定义一个类继承接口 /// </summary> public class Car : ICarEquatable<Car> { //子类的属性 public string? Make { get; set; } public string? Model { get; set; } public string? Year { get; set; } public void Run() { Console.WriteLine("汽车会跑"); } /// <summary> /// 显性实现接口 /// </summary> /// <param name="obj"></param> /// <returns></returns> bool ICarEquatable<Car>.Equals(Car obj) { return (this.Model, this.Make, this.Year) == (obj.Model, obj.Make, obj.Year); } } public class Motorcycle : ICarEquatable<Motorcycle> { public bool Equals(Motorcycle obj) { throw new NotImplementedException(); } public void Run() { Console.WriteLine("摩托车也会跑"); } }
调用例:
ICarEquatable<Car> carnew = new Car(); carnew.Run(); ICarEquatable<Motorcycle> motorcyle = new Motorcycle(); motorcyle.Run(); Console.ReadKey();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了