Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

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

#c_sharp #.net #ооп #терминология


В нескольких статьях я прочитал вот такое: 


  Перегрузка методов поддерживает свойство полиморфизма, поскольку именно таким способом
в C# реализуется главный принцип полиморфизма: один интерфейс — множество методов.


Пообщавшись с коллегами по этому поводу, большинство высказалось что перегрузка методов(overload)
не имеет ничего общего с полиморфизмом. Так ли это?
    


Ответы

Ответ 1



И да, и нет. Смотря что они имеют в виду под полиморфизмом. В общем случае полиморфизм это возможность обращаться одинаковым образом с сущностями разных типов. Или, чуть более научно, существование общего интерфейса (в отрыве от C#) у сущностей различных типов. Это очень общее понятие, которое можно очень много на что натянуть. Что при этом произойдёт и какие абстракции языка при этом будут задействованы, не столь важно. К этому полиморфизму перегрузка методов относится самым прямым образом: это ad-hoc полиморфизм для функции: в неё можно передавать различные типы (в границах реализованных перегрузок) и при этом будет выполнен разный код. (А методы объектов классов можно рассматривать, как функции с дополнительным неявным аргументом: объектом, у которого метод вызывается [this в шарпе].) Может возникнуть закономерный вопрос: не являются ли тогда различные перегрузки разными функциями, не ломается ли при этом соответствие определению полиморфизма? Ответ: полиморфизм существует на уровне языка, и если в языке перегрузки с одинаковыми названиями, но разными типами, считаются одной и той же функцией, то определение соблюдено и всё ок. Уровнями ниже, конечно, разный код размещается в разных местах и реализация как-то должна направлять в разные места, технически обращаясь с переданными значениями по-разному. Но вы с этими уровнями напрямую уже не работаете, полиморфизм там если и есть (что вряд ли) то не совсем (или совсем не?) тот, которым вы пользуетесь. В ООП же под полиморфизмом обычно понимают гораздо более узкое понятие: возможность вызывать один и тот же метод у любого объекта заданного класса/интерфейса или любого его подкласса/реализации. К этому полиморфизму перегрузка действительно не имеет отношения.

Ответ 2



Перегрузка функций это ad hoc полиморфизм. (*Ad hoc, лат, ситуационно, на данный случай) Традиционно, в ООП сообществе "полиморфизмом" принято называть только разновидность полиморфизма связанную с подтипами. При этом в ФП сообществе "полиморфизмом" называют параметрический полиморфизм. Википедия приводит три вида полиморфизма в CS - ad hoc, параметрический и подтипы. Впрочем другие источники могут предлагать иное деление. Термины "статический" и "динамический" полиморфизм применимы только к конкретной реализации конкретного языка, в частности в языке с динамической типизацией перегрузка функций может быть реализована во время работы программы.

Ответ 3



Понятие полиморфизма не имеет четкого определения, но для объктно-ориентированного подхода обычно принимают что существует два типа полиморфизма: Динамический (использование виртуальных методов и их переопределение в классах потомках) - в этом случае версия вызываемого кода определяется CLR на этапе выполнения, проходя по цепи переопределений в классах потомков. Статический (использование обобщений (generics)) - в этом случае используется одна и таже версия кода для объектов различных типов. Перегрузка методов исходя из вышеприведенной терминологии не является полиморфизмом, т.к. конкретный код и тип объекта известен на этапе КОМПИЛЯЦИИ. Другими словами, в данном случае мы просто имеем РАЗЛИЧНЫЕ методы с одинаковым именем, различающиеся типами или количеством передаваемых параметров. С тем же результатом мы могли бы добавить к имени метода типы параметров, и с точки зрения архитектуры приложения ничего не изментиться, а полимрфизм - это, в первую очередь, инструмент архитектурного подхода к решению задач.

Ответ 4



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

Ответ 5



В C# допускается совместное использование одного и того же имени двумя или более методами одного и того же класса, при условии, что их параметры объявляются по-разному. В этом случае говорят, что методы перегружаются, а сам процесс называется перегрузкой методов. Рассмотри вот такой простой метод: public void OverloadMethod() { Console.WriteLine("Пустой"); } И напишем методы, перегружающие его: public void OverloadMethod(string one) { Console.WriteLine(one); } public void OverloadMethod(string one, string two) { Console.WriteLine(one + "+" + two); } Мы перегрузили метод OverloadMethod два раза. Что можем увидеть во время вызова метода: Перегрузка методов поддерживает свойство полиморфизма, поскольку именно таким способом в C# реализуется главный принцип полиморфизма: один интерфейс — множество методов. В С# каждому методу может быть присвоено одно и то же имя. Компилятор C# сам определяет, какой именно вариант метода OverloadMethod следует вызывать, исходя из типа передаваемого аргумента, во время вызова метода. В C# определено понятие сигнатуры, обозначающее имя метода и список его параметров; Применительно к перегрузке это понятие означает, что в одном классе не должно существовать двух методов с одной и той же сигнатурой. Следует подчеркнуть, что в сигнатуру не входит тип возвращаемого значения, поскольку он не учитывается, когда компилятор C# принимает решение о перегрузке метода. В сигнатуру не входит также модификатор params. Если бы C# не поддерживал перегрузки, то пришлось бы присваивать каждому методу свое имя, что не очень удобно. В данном случае метод OverloadMethod реализует несколько перегрузок. Полиморфизм - это принцип объектно-ориентированного программирования после инкапсуляции и наследования. Это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Поняте полиморфизма зачастую трактуется по разному, можно увидеть массу понятий, но все сводится к одному. В результате, ответом на вопрос: Является ли перегрузка методов полиморфизмом? - я отвечаю ДА.

Комментариев нет:

Отправить комментарий