Полиморфизм времени компиляции / перегрузка - PullRequest
2 голосов
/ 31 марта 2011

Почему перегрузка считается формой полиморфизма или способом достижения полиморфизма.

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

Ответы [ 5 ]

7 голосов
/ 31 марта 2011

Полиморфизм - это то, что происходит в время выполнения .С точки зрения ООП, это практика вызова метода, и во время компиляции не , зная, к какому объекту будет вызван метод.Классический пример - с фигурами, кругами, квадратами и т. Д. У вас есть коллекция фигур, каждая из которых создается в виде круга, квадрата и т. Д.Компилятор не знает и не заботится о том, какой тип Shape вы вызываете Draw или Erase в любой момент времени;это определение происходит при запуске программы.

Перегрузка метода происходит в время компиляции .У вас есть несколько методов с одинаковым именем , но разными параметрами .Когда вы вызываете один из методов, компилятор решит, какая из перегрузок лучше всего соответствует, на основе предоставленных вами параметров.

Почему перегрузка считается формой полиморфизма, илиспособ достижения полиморфизма.

В корне полиморфизм - это способность обрабатывать несколько типов в одном API.Технически, перегрузка метода подпадает под это.На самом деле, согласно wikipedia , перегрузка метода известна как «специальный полиморфизм», но я никогда не слышал, чтобы этот термин использовался в реальной жизни (не то, чтобы я был последним авторитетом). Обычно полиморфизм относится исключительно к динамическому связыванию методов , как в примере с Shape, Circle, Square.

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

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

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

UPDATE

@ Ли заявляет, что «не требуется, чтобы полиморфизм был механизмом времени выполнения».

Да, есть.

В C # перегрузка методов - удобный способ сообщить о намерениях и избежать нежелательных имен методов, присваивая нескольким методам одно и то же имя. Но предположим на секунду, что в C # не было перегрузки методов. Предположим, что сигнатура метода полностью состоит из его имени, игнорируя типы параметров. Что будет потеряно в этом гипотетическом языке?

Ну, на этом языке мы должны дать каждому методу свое имя. Мы должны были бы создать WriteLineString, WriteLineInt32, WriteLineUInt32 и т. Д. Это было бы довольно ужасно с точки зрения удобства использования.

Но что изменится в выразительной силе языка? Ничего такого. Мы все еще могли бы написать тот же код с несколькими изменениями имен методов. Компилятор будет разрешать одни и те же вызовы в те же места. ИЛ был бы точно таким же. Там не будет никакой разницы в эффективности, мощности или сложности.

Так что, если выразительная мощь языка и скомпилированного кода будет одинаковой в C # и в no-overloads-C #, то как перегрузки можно считать «полиморфизмом»? Полиморфизм означает проявление различного поведения в зависимости от типа объекта. Если устранение перегрузки не приводит к изменению поведения объекта, то как перегрузка может быть связана с полиморфизмом?

Время выполнения против время компиляции поведение лежит в основе полиморфизма, и оно не имеет никакого отношения к перегрузке метода.

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

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

Это не так. Это неверная информация. Перегрузка не полиморфизм. Из Полиморфизм Википедии в объектно-ориентированном программировании страница:

Ни перегрузка метода, ни переопределение метода сами по себе не являются реализациями полиморфизма.

1 голос
/ 31 марта 2011

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

public static class Math
{
    int Min(int x, int y) { ... }

    double Min(double x, double y) { ... }
}

Таким образом, вы можете вызвать Math.Min, и он выберет правильный метод в зависимости от типа переданного ему аргумента (да, вы могли бы сделать это и с помощью обобщений, нопросто как иллюстрация перегрузки).

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...