跳转到内容

C Sharp 接口实现

来自代码酷
Admin留言 | 贡献2025年4月29日 (二) 18:41的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

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#开发中更加重要。