简介
在 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}");
}
}