9. 接口 (Interface)
接口 是一种完全抽象的类,它定义了一组方法、属性、事件和索引器,但不提供这些成员的具体实现。接口用于定义对象应该具备的行为,而不关心具体实现细节。接口可以被类和结构体实现。
9.1 定义接口
基本概念
- 声明接口:使用
interface
关键字声明接口。 - 接口成员:接口可以包含方法、属性、索引器和事件,但这些成员默认是抽象的,没有实现。
- 实现接口:类或结构体可以实现一个或多个接口,必须提供接口中所有成员的具体实现。
代码示例
csharp
using System;
// 定义一个接口
public interface IAnimal
{
// 接口中可以包含方法声明
void Speak();
// 接口中可以包含属性声明
string Name { get; set; }
}
// 实现接口的类
public class Dog : IAnimal
{
// 实现接口中的属性
public string Name { get; set; }
// 实现接口中的方法
public void Speak()
{
Console.WriteLine("Woof!");
}
}
// 另一个实现接口的类
public class Cat : IAnimal
{
// 实现接口中的属性
public string Name { get; set; }
// 实现接口中的方法
public void Speak()
{
Console.WriteLine("Meow!");
}
}
public class Program
{
public static void Main()
{
IAnimal dog = new Dog { Name = "Buddy" };
IAnimal cat = new Cat { Name = "Whiskers" };
dog.Speak(); // 输出: Woof!
cat.Speak(); // 输出: Meow!
Console.WriteLine(dog.Name); // 输出: Buddy
Console.WriteLine(cat.Name); // 输出: Whiskers
}
}
9.2 接口的特性
1. 多接口实现
一个类可以实现多个接口。
csharp
using System;
// 定义两个接口
public interface IAnimal
{
void Speak();
string Name { get; set; }
}
public interface IMovable
{
void Move();
}
// 实现多个接口的类
public class Dog : IAnimal, IMovable
{
public string Name { get; set; }
public void Speak()
{
Console.WriteLine("Woof!");
}
public void Move()
{
Console.WriteLine("Running");
}
}
public class Program
{
public static void Main()
{
Dog dog = new Dog { Name = "Buddy" };
dog.Speak(); // 输出: Woof!
dog.Move(); // 输出: Running
}
}
2. 接口继承
接口可以继承自一个或多个接口。
csharp
using System;
// 定义一个接口
public interface IAnimal
{
void Speak();
string Name { get; set; }
}
// 定义一个继承自 IAnimal 的接口
public interface IDog : IAnimal
{
void Fetch();
}
// 实现继承接口的类
public class Dog : IDog
{
public string Name { get; set; }
public void Speak()
{
Console.WriteLine("Woof!");
}
public void Fetch()
{
Console.WriteLine("Fetching the ball!");
}
}
public class Program
{
public static void Main()
{
Dog dog = new Dog { Name = "Buddy" };
dog.Speak(); // 输出: Woof!
dog.Fetch(); // 输出: Fetching the ball!
}
}
3. 默认接口方法
从 C# 8.0 开始,接口可以包含默认方法实现。
csharp
using System;
// 定义一个接口
public interface IAnimal
{
void Speak();
string Name { get; set; }
// 默认方法实现
void Sleep()
{
Console.WriteLine("Sleeping...");
}
}
// 实现接口的类
public class Dog : IAnimal
{
public string Name { get; set; }
public void Speak()
{
Console.WriteLine("Woof!");
}
}
public class Program
{
public static void Main()
{
IAnimal dog = new Dog { Name = "Buddy" };
dog.Speak(); // 输出: Woof!
dog.Sleep(); // 输出: Sleeping...
}
}
9.3 使用接口的好处
- 抽象:接口定义了对象应该具备的行为,而不关心具体实现细节。
- 多态:通过接口可以实现多态,提高代码的灵活性和可扩展性。
- 解耦:接口使得类之间的依赖关系更加松散,便于维护和测试。
总结
- 接口 是一种完全抽象的类,用于定义对象应该具备的行为。
- 类和结构体可以实现一个或多个接口,并提供接口成员的具体实现。
- 接口支持多接口实现和接口继承,可以包含默认方法实现。
- 使用接口可以提高代码的抽象性、灵活性和可维护性。