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

开闭原则代码示例

class AreaCalculator
{private List<object> _shapes;public AreaCalculator(List<object> shapes){_shapes = shapes;}/// <summary>/// 计算所有形状的面积总和/// </summary>/// <returns></returns>public double Sum(){List<double> areas = new List<double>();foreach (var item in _shapes){if (item is Square s){areas.Add(Math.Pow(s.SideLength, 2));}else if (item is Circle c){areas.Add(Math.PI * Math.Pow(c.Radius, 2));}}return areas.Sum();}
}

对于上面的计算方法,考虑这样一种场景,用户想要计算一些其它形状的面积总和,比如三角形、矩形、五边形等等…… 您将不得不反复编辑此类以添加更多的 if/else 块,这就违反了开闭原则

改进

一个更好的做法是,将计算每个形状的面积的逻辑从 AreaCalculator 类中移除,并将其添加到对应每个形状的类中。我们可以定义一个带有 CalcArea 方法的接口 IShape,然后让每个形状都实现这个接口。

接口 IShape

interface IShape
{/// <summary>/// 计算面积/// </summary>/// <returns></returns>double CalcArea();
}

修改后的 Square 和 Circle 类:

/// <summary>
/// 正方形
/// </summary>
class Square : IShape
{public Square(double length){SideLength = length;}public double SideLength { get; init; }public double CalcArea(){return Math.Pow(SideLength, 2);}
}/// <summary>
/// 圆形
/// </summary>
class Circle : IShape
{public Circle(double radius){Radius = radius;}public double Radius { get; init; }public double CalcArea(){return Math.PI * Math.Pow(Radius, 2);}
}

AreaCalculator 类也要对应做一些修改:

class AreaCalculator
{private List<IShape> _shapes;public AreaCalculator(List<IShape> shapes){_shapes = shapes;}/// <summary>/// 计算面积总和/// </summary>/// <returns></returns>public double Sum(){List<double> areas = new List<double>();foreach (var item in _shapes){areas.Add(item.CalcArea());}return areas.Sum();}
}

一目了然。

原文:(45 封私信 / 10 条消息) C# 实例解释面向对象编程中的开闭原则 - 知乎

http://www.lryc.cn/news/617685.html

相关文章:

  • Pytest项目_day11(fixture、conftest)
  • js数组reduce高阶应用
  • B 树与 B + 树解析与实现
  • 可商用的 AI 图片生成工具推荐(2025 最新整理)
  • Kubernetes部署apisix的理论与最佳实践(一)
  • 专题:2025人形机器人与服务机器人技术及市场报告|附130+份报告PDF汇总下载
  • docker安装Engine stopped
  • 内置redis使用方法
  • Python 高阶函数:filter、map、reduce 详解
  • 【软考架构】主流数据持久化技术框架
  • Spring Boot Excel数据导入数据库实现详解
  • 6s081实验1
  • 机器翻译:一文掌握序列到序列(Seq2Seq)模型(包括手写Seq2Seq模型)
  • 机器学习TF-IDF算法详解
  • GPT-oss:OpenAI再次开源新模型,技术报告解读
  • 视频播放器哪个好用?视频播放器PotPlayer,KMP Player
  • FPGA学习笔记——DS18B20(数字温度传感器)
  • Mysql系列--6、内置函数
  • C++的结构体传参
  • 深度学习与遥感入门(五)|GAT 构图消融 + 分块全图预测:更稳更快的高光谱图分类(PyTorch Geometric 实战)
  • rust编译过程的中间表现形式如何查看,ast,hir,mir
  • Rust 实战五 | 配置 Tauri 应用图标及解决 exe 被识别为威胁的问题
  • istio如何采集method、url指标
  • Rust:anyhow 高效错误处理库核心用法详解
  • Elasticsearch 官方 Node.js 从零到生产
  • 用 Node.js 玩转 Elasticsearch从安装到增删改查
  • 基于动态顺序表实现【通讯录系统】:有文件操作部分哦!
  • 用 Docker 安装并启动 Redis:从入门到实战
  • Spring AI赋能图像识别:大数据模型驱动下的智能化变革
  • Webpack Loader 完全指南:从原理到配置的深度解析