C Sharp 接口实现
外观
C#接口实现[编辑 | 编辑源代码]
介绍[编辑 | 编辑源代码]
在C#中,接口(Interface)是一种完全抽象的类,它只包含方法、属性、事件或索引器的声明,而不包含实现。接口定义了一个契约,任何实现该接口的类都必须提供接口中声明的所有成员的具体实现。接口是实现多态性和松散耦合设计的关键工具。
接口的主要特点包括:
- 不能直接实例化
- 不包含字段(C# 8.0前)
- 成员默认是公共的且抽象的
- 一个类可以实现多个接口
基本语法[编辑 | 编辑源代码]
接口使用interface
关键字定义:
public interface IExampleInterface
{
void Method1();
int Property1 { get; set; }
event EventHandler Event1;
}
类实现接口使用:
符号:
public class ExampleClass : IExampleInterface
{
public void Method1()
{
Console.WriteLine("Method1 implemented");
}
public int Property1 { get; set; }
public event EventHandler Event1;
}
接口实现示例[编辑 | 编辑源代码]
下面是一个完整的示例,展示如何定义接口并实现它:
// 定义接口
public interface IShape
{
double CalculateArea();
string GetShapeName();
}
// 实现接口
public class Circle : IShape
{
public double Radius { get; set; }
public double CalculateArea()
{
return Math.PI * Radius * Radius;
}
public string GetShapeName()
{
return "Circle";
}
}
public class Rectangle : IShape
{
public double Width { get; set; }
public double Height { get; set; }
public double CalculateArea()
{
return Width * Height;
}
public string GetShapeName()
{
return "Rectangle";
}
}
// 使用示例
class Program
{
static void Main()
{
IShape circle = new Circle { Radius = 5 };
IShape rectangle = new Rectangle { Width = 4, Height = 6 };
Console.WriteLine($"{circle.GetShapeName()} area: {circle.CalculateArea()}");
Console.WriteLine($"{rectangle.GetShapeName()} area: {rectangle.CalculateArea()}");
}
}
输出:
Circle area: 78.53981633974483 Rectangle area: 24
显式接口实现[编辑 | 编辑源代码]
当一个类实现多个接口且这些接口有相同签名的成员时,可以使用显式接口实现来消除歧义:
public interface IWorker
{
void Work();
}
public interface IEater
{
void Work();
}
public class Human : IWorker, IEater
{
void IWorker.Work()
{
Console.WriteLine("Working as a worker");
}
void IEater.Work()
{
Console.WriteLine("Working as an eater");
}
}
// 使用示例
class Program
{
static void Main()
{
Human human = new Human();
((IWorker)human).Work(); // 输出: Working as a worker
((IEater)human).Work(); // 输出: Working as an eater
}
}
默认接口方法(C# 8.0+)[编辑 | 编辑源代码]
从C# 8.0开始,接口可以包含默认实现:
public interface ILogger
{
void Log(string message);
// 默认实现
void LogError(string errorMessage)
{
Log($"ERROR: {errorMessage}");
}
}
public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine(message);
}
// 不需要实现LogError,除非想覆盖它
}
// 使用示例
class Program
{
static void Main()
{
ILogger logger = new ConsoleLogger();
logger.Log("Regular message"); // 输出: Regular message
logger.LogError("Something bad"); // 输出: ERROR: Something bad
}
}
接口继承[编辑 | 编辑源代码]
接口可以继承其他接口:
public interface IReadable
{
string Read();
}
public interface IWritable : IReadable
{
void Write(string content);
}
public class FileHandler : IWritable
{
public string Read()
{
return "File content";
}
public void Write(string content)
{
Console.WriteLine($"Writing: {content}");
}
}
实际应用场景[编辑 | 编辑源代码]
接口在实际开发中有广泛应用,例如:
1. 插件系统:定义插件接口,允许第三方开发者创建兼容的插件 2. 数据访问层:定义数据访问接口,便于切换不同的数据库实现 3. 单元测试:通过接口创建模拟对象进行测试 4. 依赖注入:通过接口解耦组件
示例:数据访问层接口
public interface IUserRepository
{
User GetById(int id);
void Add(User user);
void Update(User user);
void Delete(int id);
}
public class SqlUserRepository : IUserRepository
{
// SQL Server实现
}
public class MongoUserRepository : IUserRepository
{
// MongoDB实现
}
// 使用时可以轻松切换数据源
IUserRepository repository = new SqlUserRepository(); // 或 MongoUserRepository
接口与抽象类比较[编辑 | 编辑源代码]
特性 | 接口 | 抽象类 |
---|---|---|
支持 | 不支持 | ||
C# 8.0+支持 | 支持 | ||
C# 8.0+支持静态字段 | 支持 | ||
不支持 | 支持 | ||
成员默认public | 可以有各种访问修饰符 |
最佳实践[编辑 | 编辑源代码]
- 优先使用接口而不是抽象类来实现多态
- 接口命名以"I"开头(如
IEnumerable
) - 保持接口小巧专注(单一职责原则)
- 考虑使用接口隔离原则,避免"胖接口"
- 显式接口实现可用于隐藏不常用的成员
总结[编辑 | 编辑源代码]
C#接口是实现多态和创建灵活、可扩展架构的强大工具。通过定义契约而不指定实现细节,接口允许不同的类以统一的方式被使用。随着C#的发展,接口功能不断增强(如默认方法),使其在现代C#开发中更加重要。