В ООП перегрузка оператора - фактически полиморфизм или перегрузка параметров? - PullRequest
7 голосов
/ 28 марта 2011

является ли перегрузка оператора фактическим полиморфизмом или перегрузкой параметров?

Правда ли, что полиморфизм обычно ссылается на разные классы, отвечающие на одно и то же «сообщение» (имя метода), и делает разные вещи, поэтому

bird.give_sound()

и

car.give_sound()

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

bird.give_sound()

и

bird.give_sound(:frighten_sound)

могут быть разными.

То есть перегрузка операторов является строго перегрузкой параметров?например:

"foo" + "bar"
"foo" + 3

по крайней мере в Ruby, он отправляет сообщение + в строку, содержащую foo, первая строка отправляет строку параметра, вторая отправляетпараметр 3 и + делают немного разные вещи, но это тот же класс получателя String

В следующем примере это полиморфизм:

"foo" + 3
1 + 3

, потому что *Сообщение 1029 * вызывает различные методы разных классов, но с одним и тем же именем сообщения +.Таким образом, в этих двух случаях это полиморфизм, а не перегрузка операторов?

Является ли приведенное выше точным и правильным?Есть ли что-то, что может быть добавлено или исправлено выше?

Ответы [ 4 ]

2 голосов
/ 28 марта 2011

Спасибо за разъяснение контекста в вашем комментарии. Да, я бы сказал, что вы правы.

Подводя итог как можно короче ...

Дано идентичное имя метода (или «сообщение»):

  • различное поведение в зависимости от типа параметра - перегрузка,
  • различное поведение в зависимости от типа объекта - полиморфизм.
1 голос
/ 28 марта 2011

Я собираюсь сделать удар в темноте и сказать, что это вроде (но не совсем) оба.

Каждый объект должен иметь дело с данным объектом (объект с правой стороны от оператора) определенным образом. Похоже, что со строками будет использоваться метод toString (или эквивалент другого языка). Таким образом, вы всегда добавляете строку (передается методу как Object). ( Полиморфизм )

Однако вашему объекту может потребоваться выполнить другую логику в зависимости от данного объекта. Например, скажем, у вас есть Student объект. У вас может быть одна версия метода, которая берет объект Class и добавляет его в расписание занятий ученика. Затем у вас может возникнуть перегрузка, которая, скажем, наберет Book и добавит его в коллекцию необходимых для чтения материалов ученика. ( Перегрузка параметров )

0 голосов
/ 28 марта 2011

Хороший вопрос.

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

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

Когда я читаю это:

// (строка) x = (строка) "foo" + (int) 3 x = "foo" + 3

Я думаю об этом:

// (строка) x = (строка) "foo" .concat ((int) 3) x = "foo" .concat (3)

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

Я бы предложил, чтобы избежать перегрузки операторов параметрами объекта и использовать функции explicity.

0 голосов
/ 28 марта 2011

Полиморфизм - это когда один тип данных динамически ведет себя как другой тип данных. (Динамическое приведение типов)

Shape
  Qudrilateral
    Rect
    Rhombus
  Elliptoid
    Oval
    Circle

Полиморфизм автоматически выбирает правильный метод area () для данного контекста объекта

ОператорПерегрузка происходит, когда вы выбираете правильный метод области для контекста метода (т. е. количество переданных аргументов или тип переданных аргументов). Таким образом, если у Rect было два метода области, один из которых принимал один аргумент (квадрат), а другой - два аргумента (любой другой)прямоугольник)

Таким образом, в зависимости от контекста использования определение операторов для данного объекта может привести либо к полиморфизму, либо к перегрузке операторов.

...