当前位置: 首页 > 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.dtcms.com/a/326232.html

相关文章:

  • Spring Framework源码解析——BeanPostProcessor
  • 进程的理解
  • 无人机航拍数据集|第12期 无人机停车场车辆计数目标检测YOLO数据集1568张yolov11/yolov8/yolov5可训练
  • 数字图像处理4
  • Spring Framework源码解析——InitializingBean
  • 线程池ThreadPoolExecutor源码剖笔记
  • 对自己的 app 进行分析, 诊断,审视
  • pcl完成halcon3d中的下采样(按对角个数)
  • 网络资源模板--基于Android Studio 实现的手绘板App
  • DNS(域名系统)详解与 BIND 服务搭建
  • C# 异步编程(BeginInvoke和EndInvoke)
  • 【Java后端】Quartz任务调度核心机制详解:从基础编排到动态控制
  • Qwen 3 架构深度解析:混合推理、MoE创新与开源生态的全面突破
  • CSPOJ:1561: 【提高】买木头
  • 智能小e-智能办公文档
  • OCAD for Orienteering 20Crack 定向越野:工作流程
  • Chrome插件开发【Service Worker练手小项目】
  • MySQL 运算符
  • [CSP-J 2021] 小熊的果篮
  • Oracle数据库Library cache lock阻塞问题排查
  • 银河麒麟V10配置KVM的Ubuntu虚机GPU直通实战
  • AI测试平台实战:深入解析自动化评分和多模型对比评测
  • 人工智能-python-机器学习-逻辑回归与K-Means算法:理论与应用
  • 机器学习之DBSCAN
  • Redis中的AOF原理详解
  • 【unity实战】在Unity中实现不规则模型的网格建造系统(附项目源码)
  • CI/CD的持续集成和持续交付
  • 变频器实习DAY26 CDN 测试中心使用方法
  • 标准IO详解(fgets、gets、fread、fwrite、fseek 等应用)
  • ubuntu24.04设置登陆背景图片