Почему полиморфизм это удобно? [дубликат]

229
31 августа 2018, 12:30

На данный вопрос уже ответили:

  • Почему необходимо инициализировать коллекции именно так? 4 ответа
  • Правильно понять полиморфизм 1 ответ

На собеседовании по java спросили - зачем писать, к примеру,

Фигура треугольник = new Треугольник(), 

а не просто

Треугольник треугольник = new Треугольник() 

и почему это удобно?

Answer 1

Можно здесь много антимоний развести, конечно: что это ни фига не полиморфизьм, что это вообще не об этом, что это и т.д.

Отвечу так:

  1. Когда пишем: Фигура треугольник = new Треугольник(), мы подразумеваем, что треугольник рассматриваем как наследник класса Фигура (ну или что Треугольник реализует интерфейс Фигура)
  2. Что подразумевает, что методы класса/интерфейса Фигура реализованы в классе Треугольник (например Фигура.площадь() - реализуется в разных классах по разному)
  3. Кроме этого мы неявно подразумеваем, что возможно где-то есть класс(ы) Четырехугольник, Многоугольник или даже Серо-буро-малиновый-овал, которые также наследники класса Фигура
  4. Все это вместе дает нам право сказать, что вместо Треугольник мы переходим на другой уровень абстракции Фигура и можем например рассматривать не отдельные коллекции треугольников, многоугольников, а сразу 1 коллекцию фигур - ну и т.д. и т.п.
  5. Далее переходим к заключении, что написавший сию строку прогер - невероятно крут и умеет абстрактно мыслить и все такое прочее.
Answer 2

Конкретно в указанном вами примере - практически ничем.

Если это определение локальной переменной в каком-то методе(вероятней всего так), то правильным ответом будет "потому что в компании принято соглашение писать именно так" - ни о каких "удобствах" тут и речи быть не может- просто субьективное предпочтение людей составлявших это самое соглашение.

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

READ ALSO
Можно ли увеличить лимит конструктора JAVA?

Можно ли увеличить лимит конструктора JAVA?

Код очень объемный, из-за чего столкнулся с лимитом: The code of constructor Window(String) is exceeding the 65535 bytes limitМожно ли как-то увеличить этот лимит, если нет,...

240
Связь в бд между 2 юзерами

Связь в бд между 2 юзерами

У меня есть пользователь1 в бд, у которого есть эдакая репутацияКак сохранять то, что пользователь2 уже добавил репутацию пользователю1?

219
Как вернуть HashMap

Как вернуть HashMap

Код с сокращениями, тут суть)

229
Нужно передать String из SearchViewAdapter'a в активность

Нужно передать String из SearchViewAdapter'a в активность

Имеется адаптер, в котором на основе запроса формируется строка textToSpeech, мне нужно эту строку передать в активностьКод адаптера:

198