接口定义能力,抽象类封装共性。C#中接口用于规范行为契约,支持多继承,适用于跨类型共享功能;抽象类提供部分实现,仅支持单继承,适合共性逻辑复用。

在 C# 中,接口(Interface)和抽象类(Abstract Class)是实现多态和代码复用的重要机制。它们都用于定义行为契约,但使用场景和规则有所不同。下面详细介绍如何实现接口和抽象类,并说明它们的区别与适用情况。
接口的实现
接口定义了一组方法、属性、事件或索引器的签名,不包含实现。任何类或结构实现接口时,必须提供这些成员的具体实现。
定义接口:
public interface IRunnable{ void Run(); int Speed { get; set; }}实现接口:
public class Car : IRunnable{ public int Speed { get; set; }public void Run() { Console.WriteLine($"Car is running at {Speed} km/h"); }}
一个类可以实现多个接口,例如:
public class Car : IRunnable, IStoppable接口中的所有成员默认都是公共的、抽象的,不能有访问修饰符,也不能包含字段(除常量外)。
抽象类的实现
抽象类是不能被实例化的类,通常用于作为基类提供通用功能。它可以包含抽象成员(无实现)和具体实现的成员。
定义抽象类:
public abstract class Vehicle{ public string Brand { get; set; }// 抽象方法,子类必须实现 public abstract void Start();
// 虚方法,子类可选择重写 public virtual void Stop() { Console.WriteLine("Vehicle stopped."); }}
继承并实现抽象类:
public class Motorcycle : Vehicle{ public override void Start() { Console.WriteLine("Motorcycle engine started."); }}抽象类允许包含字段、构造函数、访问修饰符,并且只能单继承。
接口与抽象类的选择
理解何时使用接口,何时使用抽象类,对设计良好的面向对象系统至关重要。
- 使用接口:当你需要定义对象“能做什么”时,比如日志记录(ILogger)、数据序列化(ISerializable)。接口适合跨不同类型共享行为,支持多继承。
- 使用抽象类:当你有一组相关类共享部分实现逻辑时。比如多种车辆都有品牌、颜色等共性,启动方式不同但停止逻辑相似。
- 接口更适合插件式架构、依赖注入;抽象类更适合具有层级关系的类体系。
常见注意事项
- 接口不能包含字段,但可以有属性、方法、事件、索引器。
- 抽象类可以有构造函数,用于初始化共有状态。
- 从 C# 8.0 开始,接口可以包含默认实现的方法,但这不改变其主要用途。
- 避免过度设计,优先使用接口隔离职责,按需使用抽象类减少重复代码。
基本上就这些。掌握接口和抽象类的使用,能让你的 C# 程序更具扩展性和维护性。关键是理解它们的设计意图:接口定义能力,抽象类封装共性。








