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

使用多态来替换条件语句

Replace Conditional with Polymorphism

要将 条件语句(如 if 或 switch)替换为 多态,你需要将代码中的条件逻辑提取到不同的类中,并利用面向对象的多态性来动态选择行为。这样做的好处是可以让代码更加清晰、易扩展,且符合开放封闭原则(即对扩展开放,对修改封闭)。

举个例子:
假设你有如下代码,其中有很多条件语句来根据不同的类型执行不同的行为:

class Shape {
public:
    virtual double area() const = 0;
};

class Circle : public Shape {
public:
    double radius;
    Circle(double r) : radius(r) {}
    double area() const override {
        return 3.14 * radius * radius;
    }
};

class Square : public Shape {
public:
    double side;
    Square(double s) : side(s) {}
    double area() const override {
        return side * side;
    }
};

class AreaCalculator {
public:
    double calculateArea(Shape* shape) {
        if (dynamic_cast<Circle*>(shape)) {
            Circle* circle = dynamic_cast<Circle*>(shape);
            return 3.14 * circle->radius * circle->radius;
        } else if (dynamic_cast<Square*>(shape)) {
            Square* square = dynamic_cast<Square*>(shape);
            return square->side * square->side;
        }
        return 0.0;
    }
};

在这个例子中,AreaCalculator 使用了 if 语句来判断不同形状并计算它们的面积。这个代码显得非常不灵活,假如未来我们需要支持更多的形状类型,就必须修改 AreaCalculator 类。

使用多态来替换条件语句
我们可以通过将每个形状的面积计算逻辑放入各自的 area 方法中,来利用多态性消除条件判断。

首先,定义一个 Shape 基类,并让每个具体的形状类实现自己的 area() 方法:

class Shape {
public:
    virtual double area() const = 0;  // 纯虚函数
    virtual ~Shape() = default;        // 虚析构函数
};

class Circle : public Shape {
public:
    double radius;
    Circle(double r) : radius(r) {}
    double area() const override {
        return 3.14 * radius * radius;
    }
};

class Square : public Shape {
public:
    double side;
    Square(double s) : side(s) {}
    double area() const override {
        return side * side;
    }
};

接下来,在 AreaCalculator 中,直接利用多态来调用每个具体形状的 area() 方法,而不需要使用条件语句:

class AreaCalculator {
public:
    double calculateArea(Shape* shape) {
        return shape->area();  // 利用多态直接调用正确的 area() 方法
    }
};

使用示例:

int main() {
    Circle circle(5);
    Square square(4);
    
    AreaCalculator calculator;
    
    std::cout << "Circle area: " << calculator.calculateArea(&circle) << std::endl;  // 3.14 * 5 * 5
    std::cout << "Square area: " << calculator.calculateArea(&square) << std::endl;  // 4 * 4
}

优点:

  1. 消除了条件语句:通过多态,AreaCalculator 类不再需要判断具体的形状类型,而是通过虚函数机制动态调用正确的 area()
    方法。
  2. 易于扩展:如果你将来添加更多形状(如 Triangle),只需继承 Shape 并实现 area() 方法,不需要修改
    AreaCalculator 类。
  3. 更符合面向对象原则:多态性使得行为的改变更加灵活,并且将每个形状的逻辑封装到自己的类中,符合单一职责原则(SRP)。

总结:

将条件语句替换为多态,关键在于利用类和继承的机制,确保每个具体类型的行为都在它自己类的成员函数中实现。通过多态性,系统可以根据对象的实际类型动态地选择正确的行为,而无需显式地判断类型。这样可以使代码更易于扩展和维护。


文章转载自:

http://9jfadhi4.rmchq.cn
http://qg622zaZ.rmchq.cn
http://4yBh3F4u.rmchq.cn
http://X3iK0HcK.rmchq.cn
http://2IFtG70l.rmchq.cn
http://7PEvHKKw.rmchq.cn
http://QgNuD5sa.rmchq.cn
http://jV3NAeNs.rmchq.cn
http://5PFaHwaB.rmchq.cn
http://mjN5JDPv.rmchq.cn
http://l8sWBxqx.rmchq.cn
http://HIn9zZZ1.rmchq.cn
http://wsioyzOz.rmchq.cn
http://ZUmZy2KM.rmchq.cn
http://XmkDdamS.rmchq.cn
http://UzNpEFP3.rmchq.cn
http://nv4uS5x8.rmchq.cn
http://VQX0zHKS.rmchq.cn
http://oQunNuxY.rmchq.cn
http://iqmMJS9g.rmchq.cn
http://eGWgAKMk.rmchq.cn
http://ktioCmOW.rmchq.cn
http://l2Pe1kvY.rmchq.cn
http://3OBpH9B1.rmchq.cn
http://8c9RKNQ9.rmchq.cn
http://20sIKTPl.rmchq.cn
http://xeMBZEAp.rmchq.cn
http://GX3R1EFp.rmchq.cn
http://4RNX01by.rmchq.cn
http://Yxu7F8Ct.rmchq.cn
http://www.dtcms.com/a/28585.html

相关文章:

  • 【嵌入式Linux应用开发基础】进程间通信(3):共享内存
  • 遗传算法与深度学习实战系列,自动调优深度神经网络和机器学习的超参数
  • 完美转发使用
  • 现代任务调度系统架构深度解析——以TaskSchedulerController为核心的弹性任务管理方案
  • Spring AI集成Ollama调用本地大模型DeepSeek
  • Spring AOP
  • langflow中添加Siliconflow组件
  • 拆解微软CEO纳德拉战略蓝图:AI、量子计算、游戏革命如何改写未来规则!
  • DAY01-如何合理配置线程池的核心参数
  • 【机器学习】衡量线性回归算法最好的指标:R Squared
  • js中常用方法整理
  • 动态库和静态库(Linux环境)
  • TOGAF之架构标准规范-信息系统架构 | 应用架构
  • Leetcode2595:奇偶位数
  • 纯手工搭建整套CI/CD流水线指南
  • 基于深度学习进行呼吸音检测的详细示例
  • 物联网简介集合
  • 数电笔记——第一章 数制和码制
  • 基于 Flask 与 MySQL 构建简单的博客系统
  • Java并发编程——并发容器
  • 【Research Proposal】基于提示词方法的智能体工具调用研究——研究现状
  • 动态库加载(可执行程序和地址空间)
  • 用LightRAG+智谱GLM-4提升政务对话精度:从知识图谱到精准问答的实战指南
  • 25重庆事业单位联考明日报名[特殊字符]全流程[特殊字符]
  • Dev-Atlas:典型发育青少年功能性脑网络参考图谱
  • RedissonClient:ZSet(有序集合)上手教程
  • 九、OSG学习笔记-NodeVisitor节点遍历器
  • 当滑动组件连续触发回调函数的三种解决办法
  • 回调处理器
  • Qt程序退出相关资源释放问题