C# 接口

简介

在 C# 编程中,接口是一种关键的构建块,用于定义类可以实现的公共功能。它提供了一种方式来指定一组方法、属性、事件和索引器的签名,但不提供其实现。这种特性使得接口在构建灵活和可维护的系统时极为重要

接口是什么?接口的定义:

  • 接口在C#中使用 interface关键字定义。
  • 接口的定义与类相似,但是不包含任何的实现。
  • 接口会指定一组函数成员,但是不实现它们的引用类型。可以看作是一种契约,任何实现该接口的类都必须提供接口中定义的所有成员的具体实现。

语法

cs 复制代码
public interface IAnimal
{
    void happy();
    //void 其他的方法签名();
}

接口的特点

  • 接口里面只能定义方法的签名,但是定义具体的实现功能
  • 类需要全部实现接口里面定义的方法
  • 接口可以多继承

以下是一个简单的接口代码

cs 复制代码
using System;

namespace 接口
{
    interface IDog//这里是为了C#代码的书写规范,前面要加上I
    {
        void Sleep();
    }
    class Event : IDog
    {
        public void Sleep() 
        {
            Console.WriteLine("狗在睡觉!");
        } 
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            Event e = new Event();
            e.Sleep();
            Console.ReadKey();
        }
    }
}

在此代码里面,我们也可以利用接口类型来承接一个子类型的对象

但是,接口类型是无法创建接口的实例


接口的多继承

cs 复制代码
using System;

namespace 接口
{
    interface IDog
    {
        void Sleep();
    }
    interface ICat
    {
        void Eat();
    }
    class Event : IDog, ICat
    {
        public void Sleep() 
        {
            Console.WriteLine("狗在睡觉!");
        }
        public void Eat() 
        {
            Console.WriteLine("猫在吃鱼!");
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            Event e = new Event();
            e.Sleep();
            e.Eat();
            Console.ReadKey();
        }
    }
}

在这里面,我新添加了一个接口,在Event类中去实现 IDog 和 ICat 接口,在主函数里面输出


小贴士(啊哈哈哈哈哈)

在我们子类需要继承基类和接口的时候,基类需要写在最前方,因为这是乌龟的屁股(规定)!


接口与抽象类类似,但它们有一些关键区别

  • 接口:可以被多个类实现,一个类可以实现多个接口;接口不能包含字段、构造函数。
  • 抽象类:只能被一个类继承;可以包含字段、构造函数、析构函数及实现的方法。

接口与类的差异

  • 接口:只能包含方法签名、属性、事件和索引器;不能包含实现。
  • :可以包含实现、字段、构造函数等。

使用类的情况

  • 当你需要定义具体实现。
  • 当你需要实现继承和复用代码。
  • 当你需要管理状态或包含字段。

使用接口的情况

  • 当你需要定义一个契约或协议而不关注具体实现。
  • 当你需要支持多态性和依赖注入。
  • 当你需要一个类实现多个不同的功能组合。

接口的高级特性

C# 8.0引入了接口的默认实现,允许接口中的方法有一个默认的实现,这样实现接口的类可以选择使用默认实现或者提供自己的实现。

cs 复制代码
public interface IShape
{
    double Area { get; }
    double Perimeter { get; }
    void Draw(); // 默认实现
}

public class Circle : IShape
{
    public double Radius { get; set; }

    double IShape.Area => Math.PI * Radius * Radius;
    double IShape.Perimeter => 2 * Math.PI * Radius;

    public void Draw() // 重写默认实现
    {
        Console.WriteLine($"Drawing a circle with radius {Radius}");
    }
}
相关推荐
傻啦嘿哟4 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670794 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
李少兄5 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
Seoyoneh6 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
Tangyuewei6 小时前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界7 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
繁星蓝雨7 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
Evand J8 小时前
【MATLAB例程,图像降噪滤波9】自适应维纳滑动窗口滤波(Wiener)图像降噪、方法对比,有中文注释
开发语言·图像处理·计算机视觉·matlab·滑动窗口·滤波·降噪
杜大哥8 小时前
python程序:如何查看电脑【电池电量的剩余百分比】 和 【是否插入连接着充电器】?
开发语言·python
wuyk5558 小时前
Python网络爬虫入门到实战 第01章:爬虫到底是什么?原理、流程、合法性、风险全解析(零基础必看)
开发语言·爬虫·python