主页 > 开源代码  > 

使用多态来替换条件语句

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

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

标签:

使用多态来替换条件语句由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“使用多态来替换条件语句