开放封闭原则 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