• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
学习笔记
Misaka的学习笔记
博客园    首页    新随笔    联系   管理    订阅  订阅
菜鸟学习日记--------c#接口

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();

 

posted on 2023-06-19 00:01  我们打工人  阅读(52)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3