Java, определение “полиморфизм”

147
16 августа 2018, 16:30

Изучаю Java. Понял что не могу нормально дать определение полиморфизму. Погуглил, определений нашёл много но даются тяжело. Составил дилетанское своё, но не уверен что оно верное и полное. Прошу дополнить и исправить если оно неверно, т.к скорее всего я суть вопроса до конца еще не понял.

Полиформизм - это подход при котором в переменной, имеющей тип родителя, допускается хранение ссылки на его потомка. Соответственно допускается использование потомка там где по сигнатуре ожидается родитель, причём в случае "подмены" при попытке вызова какого - либо метода у родителя будет вызван метод потомка. Таким образом полиморфизм позволяет абстрагироваться от конкретных реализаций методов.

Суть в том чтобы дать определение без примеров.

Answer 1

Прежде всего хотелось бы отметить, что полиморфизм одна из трех основных парадигм ООП(наследование, инкапсуляция я полиморфизм). Второе - это то, что полиморфизм является базой для всех GoF паттернов проектирования, т.е. практически все они так или иначе строятся на нем.

К сожалению без примеров автору этого вопроса без примеров будет все намного сложнее понять... Поэтому для начала представлю простой пример, того что он ин из себя представляет:

abstract class Figure {
    ...
    abstract void move();
    ...
}
class Cube extends Figure {
    @Override
    public void move(){
        // moving
    }
}
class Line extends Figure {
    @Override
    public void move(){
        // moving
    }
}
enum TypeFigure {
    CUBE,
    LINE
}
...
List<Figure> figures = new LinkedList<>;
while (true) {
    Random random = new Random();
    int typeFigures = { TypeFigure.CUBE, TypeFigure.LINE };
    switch (random.nextInt(typeFigures.length)) {
         case TypeFigure.CUBE:
              Cube cube = new Cube();
              cube.move();
              figures.add(cube);
              break; 
         case TypeFigure.LINE:
              Line line = new Line();
              line.move();
              figures.add(line);
    }
}

Здесь приведен небольшой фрагмент игры в тетрис, в котором в бесконечном цикле генерируется случайная фигура и перемещается. Суть здесь заключается в следующем у нас есть разные типы фигур, которые двигаются и вращаются по разному, но нам их нужно хранить вместе, чтобы потом удалять(не было реализовано).

Для этого и был применен полиморфизм, мы создаем абстрактный класс Figure с абстрактным методом перемещения, а уже его потомки с которыми мы будем работать сами выбирают как это перемещение им реализовать...

"Таким образом полиморфизм позволяет абстрагироваться от конкретных реализаций методов." - другими словами полиморфизм позволяет делать код менее связанным, либо Grasp паттерн "Indirection". Перейдем к примеру.

  class A {
      private B b = new B();
      public void foo() {
         b.bar();
      }       
  } 
  class B {
      public void bar() {
         //
      }   
  }

В данном примере класс А зависит от класса В, но казалось бы, что в этом плохого. А теперь представьте, что вы работаете в компании и разрабатываете крупную систему. И вот в один момент приходит программист "Вася" и говорит вам: "Слушай дай мне класс А, я буду его использовать", в ответ на его вопрос он получит ответ в плане того, что для того чтобы использовать класс А, ему придется еще и брать класс В(а класс В может зависеть еще от кучи классов). Тем самым код нельзя переиспользовать другим программистам, да и вам самим в других проектах или подобных ситуациях. А теперь как это должно выглядеть.

 class A {
      // Inject with Spring
      private B b;
      public void foo() {
         b.bar();
      }       
  } 
  interface B {
      void bar();
  }
  class BImpl implements B {
      public void bar() {
         //
      }   
  }

И вот теперь когда к вам придет программист "Вася" и скажет тоже самое, он смело сможет взять ваш класс A вместе с интерфейсом B(реализовав его как ему это нужно), а не тянуть все связи от класса В.

Answer 2

Термин полиморфизм можно перевести как "Много форм". К примеру: человек может работать программистом и инженером. Такую аналогию можно привести с классами и методами. Пример полиморфизма:

class MyClass {
private int value;
MyClass (int value){
    this.value = value;
}
void method (){ }
void method (String s){ }
private void method (int i) { }
}
class MyClassExtends extends MyClass{
private String s; 
MyClassExtends (int i, String s){
    super(i);
    this.s = s;
}
@Override
void method() { }
@Override
void method(String s) { }
 }

Получается в этом коде есть суперкласс MyClass и его подкласс MyClassExtends. Получается подкласс может использовать поля данного класса, если поле не private.

Здесь есть 3 метода method (). Первый не принимает параметром; второй строчку и третий int. Это называется перегрузка - часть ООП, который позволяет одному методу иметь разные формы, которые отличаются входными параметрами и реализации.

В классе MyClassExtends переопределяется версии метода method (). Переопределение - часть ООП, который позволяет подклассу (или дочернему) свою реализацию метода суперкласса.

Получается термин полиморфизм можно объяснить так:

Полиморфизм - это возможность применения одноименных методов с одинаковыми или различными наборами параметров в одном классе или в группе классов, связанных отношением наследования.

https://o7planning.org/ru/10193/inheritance-and-polymorphism-in-java здесь вы можете дополнительно прочитать про полиморфизм.

Answer 3

Полиморфизм - это свойство объекта иметь свою собственную реализацию виртуального метода(ов). В Java это достигается с помощью перекрытия виртуальных методов. В этом случае вы можете пользоваться типом суперкласса для объектов созданных их подклассов и при вызове виртуальных методов суперкласса вызываются соответствующие методы подклассов. Это свойство в полной мере относится к абстрактным методам и методам интерфейсов, которые являются чисто виртуальными.

Вот собственно определение полиморфизма взятое из википедии

Полиморфизм - это способность объекта принимать различные формы. Наиболее частое использование полиморфизма в ООП происходит, когда ссылка на родительский класс используется для ссылки на объект дочернего класса. Любой объект Java, который может содержать более одной связи IS-A, считается полиморфным.

Т.е. для того, чтобы класс был полиморфным, достаточно иметь более одного подкласса данного класса. Но этого не достатоточно для полиморфизма данного класса потому, что полиморфизм достигается если полиморфный класс перекрыватся виртуальными методами подклассов.

Answer 4

Полиморфизм - принцип объектно-ориентированного программирования, обеспечивающий работу метода класса-потомка, перекрывающего виртуальный метод класса-предка, при использовании интерфейса переменной класса-предка, если в переменной размещен объект класса-потомка.

READ ALSO
Синтез речи в Android

Синтез речи в Android

Чем отличается TextToSpeechQUEUE_ADD от TextToSpeech

151
Положение консольного окна на экране

Положение консольного окна на экране

Есть несколько консольных Java приложенийЗапуск приложений производится через *

153
В чем разница между == и equals в Java?

В чем разница между == и equals в Java?

Подскажите, пожалуйста, почему в коде ниже == и equals дают одинаковый результат?

176
Static/Instance

Static/Instance

Встретил в книге данный примерНикак не могу понять, почему метод third() дает ошибку? В книге написанно, ошибка возникает из-за того, что "не статическому...

180