5

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

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

а не просто

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

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

Nazar019
  • 133
  • Из-за абстракции? –  Jul 10 '18 at 14:21
  • 4
    Низачем. Это не имеет значения. –  Jul 10 '18 at 14:22
  • 1
    @free_ze, [tag:php] o_O? Скорее уж это: https://ru.stackoverflow.com/q/513092/178988, но я не уверен. – Qwertiy Jul 10 '18 at 14:25
  • @Qwertiy Я думаю здесь больше вопрос по терминологии, чем по языку программирования. –  Jul 10 '18 at 14:27
  • @Qwertiy, полиморфизм там тоже есть, да) Соль вопроса в теории, а php - такой себе псевдокод. – free_ze Jul 10 '18 at 14:46

2 Answers2

9

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

Отвечу так:

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

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

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

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

Sergey Rufanov
  • 8,500
  • 25
  • 37