开放封闭原则 C.
在这里,我们尝试使用代码库来解释 OCP。首先,我们将展示违反 OCP 的方案,然后我们将删除该违规。
面积计算(OCP 违规代码):
public class Rectangle{
public double Width {get; set;}
public double Height {get; set;}
}
public class Circle{
public double Radious {get; set;}
}
public double getArea (object[] shapes){
double totalArea = 0;
foreach(var shape in shapes){
if(shape is Rectangle){
Rectangle rectangle = (Rectangle)shape;
totalArea += rectangle.Width * rectangle.Height;
}
else{
Circle circle = (Circle)shape;
totalArea += circle.Radious * circle.Radious * Math.PI;
}
}
}
现在,如果我们需要计算另一种类型的对象(比如,Trapezium),那么我们就要添加另一个条件。但是从 OCP 规则我们知道应该关闭软件实体进行修改。所以它违反了 OCP。
好。让我们尝试解决实施 OCP 的这种违规行为。
public abstract class shape{
public abstract double Area();
}
public class Rectangle : shape{
public double Width {get; set;}
public double Height {get; set;}
public override double Area(){
return Width * Height;
}
}
public class Circle : shape{
public double Radious {get; set;}
public override double Area(){
return Radious * Radious * Math.PI;
}
}
public double getArea (shape[] shapes){
double totalArea = 0;
foreach(var shape in shapes){
totalArea += shape.Area();
}
return totalArea;
}
现在如果我们需要计算另一种类型的对象,我们不需要改变逻辑(在 getArea()
中),我们只需要添加另一个类,如 Rectangle 或 Circle 。