简介
官方说明:接口定义协定。 实现该协定的任何 class 或 struct 必须提供接口中定义的成员的实现。 接口可为成员定义默认实现。 它还可以定义static 成员,以便提供常见功能的单个实现。 从 C# 11 开始,接口可以定义 static abstract
或 static virtual
成员来声明实现类型必须提供声明的成员。
在C#中使用 interface 关键字来定义接口,例如
cs
public interface A
{
void Test() { }
}
为什么使用接口
实现多态性
C#中的类只允许有一个父类,但可以继承多个接口。这样一个类可以实现多个接口,从而实现多重继承。这使得一个类具有多种行为,增加了代码的灵活性和可扩展性。
提供契约
接口定义了一组方法的规范,它规定了类应该具有的行为。通过实现接口,类必须遵循接口定义的方法,从而保证了代码的一致性和可靠性。
实现代码的解耦
接口将方法的定义与实现分离开来,使得代码的耦合度降低。通过接口,可以将代码分成多个模块,每个模块只关注自己的功能,从而提高了代码的可维护性和可测试性。
抽象与通用性
接口是一种用来定义程序的协议,描述了某一类或结构的一组相关行为。通过接口,可以更好地实现抽象和通用性,使得不同的事物在同一高度具有通用及可替代性。
综上所述,接口的使用有助于提高代码的可读性、可维护性、可扩展性和可复用性,是软件开发中一种重要的设计模式
C#中接口的特点
1.不能定义实例字段,但可以定义静态类型字段(使用关键字static)。
2.可以定义属性,实例属性不能有默认初始值。静态属性可以有。
3.声明的实例方法可以有默认实现,也可以没有。如果没有默认实现,在其被继承的类中必须实现。如果有默认实现,继承类中可以不实现,编译运行不会报错。但是在构建的实例类对象中不能调用,因为没有在继承类中实现。
4.可以声明定义静态方法。继承类不能直接调用。
说明:接口继承与类继承不同,父类中定义的方法和属性(非私有),继承的子类可以直接使用,并不一定需要重写。但是从接口继承的方法和属性,必须在继承类中实现,才能直接使用类实例对象或类名(静态方法)直接调用接口中定义的方法和属性。
实例
cs
public interface F
{
//编译报错:接口不能包含实例字段
//int count;
public static int staCount = 5;
//编译报错:接口中的实例属性不能具有初始值设定
//public string Name { get; set; } = "111";
public string Name { get; set; }
public static string Age { get; set; } = string.Empty;
//继承类必须实现此方法
void Test1();
//继承类可以不实现,不会报错,但是需要在继承类实例调用,需要重新实现
void Test2() { Console.WriteLine("Hello World!"); }
//编译报错:必须声明主体
//静态方法必须有实现,哪怕是只有一对{}
//static void StaTest1();
//在C#11中(.net 7框架)可以使用关键字abstract, virtual
//virtual static void StaTest1();
static void StaTest1() { }
static void StaTest2() { Console.WriteLine("静态方法"); }
}