当前位置: 首页 > ds >正文

c#抽象类和接口的异同

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

一、相同点

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

    // 错误:无法实例化抽象类
    AbstractClass ac = new AbstractClass(); 
    ​
    // 错误:无法实例化接口
    IInterface itf = new IInterface(); 
  2. 包含未实现的成员 都可以定义需要子类 / 实现类具体实现的方法(抽象方法 / 接口方法)。

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

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

二、不同点

特性抽象类(Abstract Class)接口(Interface)
关键字abstract classinterface
继承方式单继承(一个类只能继承一个抽象类)多实现(一个类可以实现多个接口)
成员类型可包含抽象成员(无实现)和具体成员(有实现)只能包含抽象成员(默认无实现,C# 8.0+ 可加默认实现)
访问修饰符成员可以有 publicprotectedinternal 等修饰符成员默认 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("汽车刹车停止");}
}

四、使用场景选择

  1. 优先使用抽象类

    • 需要在多个相关类间共享代码(字段、方法实现)。

    • 定义的是 "is-a" 关系(如 ShapeCircleRectangle)。

    • 需要控制成员的访问权限(如 protected 方法供子类调用)。

  2. 优先使用接口

    • 定义不相关类的共同行为(如 IMovable 可被 CarBird 实现)。

    • 需要多继承能力(一个类实现多个接口)。

    • 仅需规范行为,不涉及代码共享(如框架中的回调接口)。

总结

  • 抽象类是 "部分实现" 的基类,强调继承和代码复用,适合构建类的层次结构。

  • 接口是 "纯规范" 的契约,强调行为一致性,适合跨类别的功能定义。

  • 在实际开发中,两者常结合使用(如抽象类实现接口,既提供基础实现又遵循规范)。

http://www.xdnf.cn/news/16472.html

相关文章:

  • 八股文整理——计算机网络
  • Docker常用命令详解:以Nginx为例
  • 台式电脑有多个风扇开机只有部分转动的原因
  • 典型的 Vue 3 项目目录结构详解
  • 解决使用vscode连接服务器出现“正在下载 VS Code 服务器...”
  • 动态SQL标签
  • FROM stakater/java8-alpine 构建cocker镜像
  • 学习嵌入式的第三十三天-数据结构-(2025.7.25)服务器/多客户端模型
  • SSRF_XXE_RCE_反序列化学习
  • ChatIm项目文件上传与获取
  • 前缀和-238-除自身以外数组的乘积-力扣(LeetCode)
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——6. 传统算法实战:用OpenCV测量螺丝尺寸
  • nginx一个域名下部署多套前端项目
  • GRE、MGRE实验
  • RK3568笔记九十三:基于RKNN Lite的YOLOv5目标检测
  • FreeMarker模板引擎
  • 【C++】C++11特性的介绍和使用(第三篇)
  • 【RHCSA 问答题】第 10 章 配置和保护 SSH
  • 航空发动机高速旋转件的非接触式信号传输系统
  • 技术赋能与营销创新:开源链动2+1模式AI智能名片S2B2C商城小程序的流量转化路径研究
  • 工具 | 解决 VSCode 中的 Delete CR 问题
  • 小程序的客服咨询(与企业微信建立沟通)
  • (React入门上手——指北指南学习(第一节)
  • LeetCode——1957. 删除字符使字符串变好
  • 力扣---------238. 除自身以外数组的乘积
  • Ruby 数据库访问 - DBI 教程
  • Android-广播详解
  • Go-Elasticsearch v9 安装与版本兼容性
  • Flask input 和datalist结合
  • 图论:Dijkstra算法