为何使用类型替换

时间:2014-09-03 18:18:28

标签: java oop types liskov-substitution-principle

任何人都可以向我解释使用类型替换的必要性吗?

e.g。

class Circle extends Shape{
   ...
}

.
.
.

class Main{
   public static void main(String[] args){
       Shape s = new Circle();
       ...
   }
}

我们可以从上面的代码获得什么可能的好处?通常情况下,

public static void main(String[] args){
    Circle c = new Circle();
}

可以轻松完成所需的工作。

1 个答案:

答案 0 :(得分:3)

这种现象通过继承称为多态性。这意味着您的行为是在运行时决定调用哪个对象而不是调用它的引用。

好。让我们进一步扩展您的示例让我们首先创建类层次结构

class Shape{
      public void draw(){}
}

class Circle extends Shape{
      public void draw(){
          //mechanism to draw circle
      }
}

class Square extends Shape{
      public void draw(){
          //mechanism to draw square
      }
}

现在让我们看看这如何导致干净的代码

class Canvas{
     public static void main(String[] args){
        List<Shape> shapes = new ArrayList<>();
        shapes.add(new Circle());
        shapes.add(new Square());

        // clean and neat code

        for(Shape shape : shapes){
              shape.draw();
        }

     }
 }

这也可以帮助制作松耦合系统

 Class ShapeDrawer{
     private Shape shape;  

     public void setShape(Shape shape){
         this.shape = shape;
     }

     public void paint(){
         shape.draw(); 
     } 

 }

在这种情况下,ShapeDrawer与实际形状非常松散地耦合。 ShapeDrawer甚至不知道它正在绘制哪种类型的Shape,或者甚至不知道它是如何绘制抽象的机制。绘制特定形状的基础机制可以在不影响此类的情况下进行更改。