Зачем использовать подстановку типов

Может ли кто-нибудь объяснить мне, в чем необходимость использования подстановки типов?

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();
}

с легкостью выполнил бы требуемую работу.


person bytestorm    schedule 03.09.2014    source источник


Ответы (1)


Явление называется полиморфизмом через наследование. Это означает, что ваше поведение определяется во время выполнения в зависимости от того, какой объект вызывается, а не по какой ссылке он вызывается.

Хорошо. давайте расширим ваш пример дальше. Давайте сначала создадим иерархию классов

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 он рисует, или даже механизм того, как он рисует, абстрагирован от него. Базовый механизм рисования конкретной формы можно изменить, не затрагивая этот класс.

person Adi    schedule 03.09.2014
comment
Спасибо, помогло... - person bytestorm; 03.09.2014