跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 接口实现
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C#接口实现 = == 介绍 == 在C#中,'''接口(Interface)'''是一种完全抽象的类,它只包含方法、属性、事件或索引器的声明,而不包含实现。接口定义了一个契约,任何实现该接口的类都必须提供接口中声明的所有成员的具体实现。接口是实现多态性和松散耦合设计的关键工具。 接口的主要特点包括: * 不能直接实例化 * 不包含字段(C# 8.0前) * 成员默认是公共的且抽象的 * 一个类可以实现多个接口 == 基本语法 == 接口使用<code>interface</code>关键字定义: <syntaxhighlight lang="csharp"> public interface IExampleInterface { void Method1(); int Property1 { get; set; } event EventHandler Event1; } </syntaxhighlight> 类实现接口使用<code>:</code>符号: <syntaxhighlight lang="csharp"> public class ExampleClass : IExampleInterface { public void Method1() { Console.WriteLine("Method1 implemented"); } public int Property1 { get; set; } public event EventHandler Event1; } </syntaxhighlight> == 接口实现示例 == 下面是一个完整的示例,展示如何定义接口并实现它: <syntaxhighlight lang="csharp"> // 定义接口 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()}"); } } </syntaxhighlight> 输出: <pre> Circle area: 78.53981633974483 Rectangle area: 24 </pre> == 显式接口实现 == 当一个类实现多个接口且这些接口有相同签名的成员时,可以使用显式接口实现来消除歧义: <syntaxhighlight lang="csharp"> 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 } } </syntaxhighlight> == 默认接口方法(C# 8.0+) == 从C# 8.0开始,接口可以包含默认实现: <syntaxhighlight lang="csharp"> 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 } } </syntaxhighlight> == 接口继承 == 接口可以继承其他接口: <syntaxhighlight lang="csharp"> 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}"); } } </syntaxhighlight> == 实际应用场景 == 接口在实际开发中有广泛应用,例如: 1. '''插件系统''':定义插件接口,允许第三方开发者创建兼容的插件 2. '''数据访问层''':定义数据访问接口,便于切换不同的数据库实现 3. '''单元测试''':通过接口创建模拟对象进行测试 4. '''依赖注入''':通过接口解耦组件 示例:数据访问层接口 <syntaxhighlight lang="csharp"> 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 </syntaxhighlight> == 接口与抽象类比较 == {| class="wikitable" |- ! 特性 !! 接口 !! 抽象类 |- | 多重继承 | 支持 | 不支持 |- | 默认实现 | C# 8.0+支持 | 支持 |- | 字段 | C# 8.0+支持静态字段 | 支持 |- | 构造函数 | 不支持 | 支持 |- | 访问修饰符 | 成员默认public | 可以有各种访问修饰符 |} == 最佳实践 == * 优先使用接口而不是抽象类来实现多态 * 接口命名以"I"开头(如<code>IEnumerable</code>) * 保持接口小巧专注(单一职责原则) * 考虑使用接口隔离原则,避免"胖接口" * 显式接口实现可用于隐藏不常用的成员 == 总结 == C#接口是实现多态和创建灵活、可扩展架构的强大工具。通过定义契约而不指定实现细节,接口允许不同的类以统一的方式被使用。随着C#的发展,接口功能不断增强(如默认方法),使其在现代C#开发中更加重要。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 高级类特性]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)