c#抽象类和接口的区别小结

 更新时间:2025年07月27日 09:35:47   作者:张謹礧  
C#中抽象类和接口都支持多态性,但存在关键区别,实际开发中常组合使用,抽象类提供基础实现,接口确保规范一致性,下面就来介绍一下两者的区别,感兴趣的可以了解一下

在 C# 中,抽象类(Abstract Class)接口(Interface) 都是实现多态性的重要机制,用于定义规范并约束子类 / 实现类的行为,但它们在设计目的和使用场景上有显著区别。

一、相同点

无法实例化 两者都不能直接创建对象,只能作为父类(抽象类)或契约(接口)被继承 / 实现。

// 错误:无法实例化抽象类
AbstractClass ac = new AbstractClass(); 
​
// 错误:无法实例化接口
IInterface itf = new IInterface(); 

包含未实现的成员 都可以定义需要子类 / 实现类具体实现的方法(抽象方法 / 接口方法)。

支持多态 子类 / 实现类的对象可以赋值给抽象类 / 接口类型的变量,调用时会执行具体实现。

// 多态示例
AbstractClass obj1 = new ConcreteClass(); // 抽象类多态
IInterface obj2 = new InterfaceImpl();   // 接口多态
obj1.AbstractMethod(); // 执行子类实现
obj2.InterfaceMethod(); // 执行实现类方法

二、不同点

特性抽象类(Abstract Class)接口(Interface)
关键字abstract classinterface
继承方式单继承(一个类只能继承一个抽象类)多实现(一个类可以实现多个接口)
成员类型可包含抽象成员(无实现)和具体成员(有实现)只能包含抽象成员(默认无实现,C# 8.0+ 可加默认实现)
访问修饰符成员可以有 public、protected、internal 等修饰符成员默认 public,不能显式添加其他修饰符
字段 / 属性可以定义字段、普通属性不能定义字段,只能定义属性(自动属性,无字段实现)
构造函数可以有构造函数(供子类调用)不能有构造函数
方法实现可以包含有实现的方法(非抽象方法)C# 8.0 前:所有方法无实现;C# 8.0+:可添加默认实现
设计目的表示 "is-a" 关系(继承层次,共享代码)表示 "can-do" 关系(功能契约,规范行为)

三、代码示例

1. 抽象类示例

// 抽象类:包含抽象方法和具体方法
public abstract class Shape
{
    // 字段(抽象类可定义字段)
    protected string _color;
​
    // 构造函数(抽象类可有构造函数)
    public Shape(string color)
    {
        _color = color;
    }
​
    // 抽象方法(必须由子类实现)
    public abstract double GetArea();
​
    // 具体方法(提供默认实现,子类可重写)
    public virtual void PrintColor()
    {
        Console.WriteLine($"颜色:{_color}");
    }
}
​
// 继承抽象类(单继承)
public class Circle : Shape
{
    private double _radius;
​
    public Circle(string color, double radius) : base(color)
    {
        _radius = radius;
    }
​
    // 实现抽象方法
    public override double GetArea()
    {
        return Math.PI * _radius * _radius;
    }
}

2. 接口示例

// 接口:定义行为规范
public interface IMovable
{
    // 接口方法(默认public,无实现)
    void Move();
​
    // C# 8.0+ 可添加默认实现
    void Stop()
    {
        Console.WriteLine("停止移动");
    }
}
​
// 实现接口(可多实现)
public class Car : IMovable
{
    // 必须实现接口的抽象方法
    public void Move()
    {
        Console.WriteLine("汽车行驶中...");
    }
​
    // 可选:重写接口的默认实现
    public void Stop()
    {
        Console.WriteLine("汽车刹车停止");
    }
}

四、使用场景选择

优先使用抽象类

  • 需要在多个相关类间共享代码(字段、方法实现)。
  • 定义的是 "is-a" 关系(如 ShapeCircleRectangle)。
  • 需要控制成员的访问权限(如 protected 方法供子类调用)。

优先使用接口

  • 定义不相关类的共同行为(如 IMovable 可被 CarBird 实现)。
  • 需要多继承能力(一个类实现多个接口)。
  • 仅需规范行为,不涉及代码共享(如框架中的回调接口)。

总结

  • 抽象类是 "部分实现" 的基类,强调继承和代码复用,适合构建类的层次结构。
  • 接口是 "纯规范" 的契约,强调行为一致性,适合跨类别的功能定义。
  • 在实际开发中,两者常结合使用(如抽象类实现接口,既提供基础实现又遵循规范)。

 到此这篇关于c#抽象类和接口的区别小结的文章就介绍到这了,更多相关c#抽象类和接口区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Unity快速生成常用文件夹的方法

    Unity快速生成常用文件夹的方法

    这篇文章主要介绍了Unity快速生成常用文件夹的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • C#图表开发之Chart详解

    C#图表开发之Chart详解

    C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对象,每个Series代表图表中的一个数据系列,Series对象有一个Points属性,用于存储数据点,每个数据点是一个DataPoint对象
    2024-12-12
  • C#9.0中init访问器的实现

    C#9.0中init访问器的实现

    本文主要介绍了C#9.0中init访问器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • C#中TextBox实现输入提示功能的方法

    C#中TextBox实现输入提示功能的方法

    这篇文章主要介绍了C#中TextBox实现输入提示功能的方法,涉及C#中TextBox的相关操作技巧,需要的朋友可以参考下
    2015-06-06
  • C#获取系统当前日期和时间的示例详解

    C#获取系统当前日期和时间的示例详解

    这篇文章主要为大家详细介绍了C#如何使用DateTime的Now静态属性动态获得系统当前日期和时间,文中的示例代码讲解详细,有需要的小伙伴可以参考一下
    2024-01-01
  • C# ZIP生成代码总出错的原因和解决方法

    C# ZIP生成代码总出错的原因和解决方法

    本文讲解C#生成ZIP文件的核心步骤与常见问题,包括使用MemoryStream作为虚拟快递箱、ZipArchive压缩管理、异步传输优化、大文件处理技巧及动态文件夹结构生成,同时解析文件打不开、体积异常等错误原因和解决方案,需要的朋友可以参考下
    2025-07-07
  • 详解c# 接口IDisposable的用法

    详解c# 接口IDisposable的用法

    这篇文章主要介绍了详解c# 接口IDisposable的用法,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-10-10
  • C#简单访问SQLite数据库的方法(安装,连接,查询等)

    C#简单访问SQLite数据库的方法(安装,连接,查询等)

    这篇文章主要介绍了C#简单访问SQLite数据库的方法,涉及SQLite数据库的下载、安装及使用C#连接、查询SQLIte数据库的相关技巧,需要的朋友可以参考下
    2016-07-07
  • C#数据结构与算法揭秘三 链表

    C#数据结构与算法揭秘三 链表

    这节我们讨论链表的基本操作,并且画图以证明,下届中我们将讨论双向链表,环形链表 应用举例
    2012-11-11
  • 利用C#实现获取与监控电脑系统信息

    利用C#实现获取与监控电脑系统信息

    在C#中,获取与监控电脑系统信息通常可以通过多种方式实现,这篇文章主要为大家整理了几种常见的方法及其示例代码,希望对大家有所帮助
    2024-11-11

最新评论