Полиморфизм - Определение всего в двух предложениях [закрыто]

StackOverflow https://stackoverflow.com/questions/409969

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Почему только два предложения?Потому что определение короткое и разумное.Объяснение длинное и содержит примеры и код.Посмотрите здесь пояснения (ответ на этих страницах не соответствует моему вопросу).:

Полиморфизм против Переопределения против Перегрузки
Постарайтесь описать полиморфизм как можно проще

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

Если вы действительно не можете сформулировать требование в двух предложениях (это сложная тема для определения), то ничего страшного, если вы перейдете к нему.Идея состоит в том, чтобы иметь определение, которое фактически определяет, что такое полиморфизм, и не объясняет, что он делает или как его использовать (улавливаете разницу?).

Это было полезно?

Решение

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

(*) Во всяком случае, в идеальном случае - очевидно, что довольно часто вызывающий код выбирал соответствующую реализацию очень сознательно!

Другие советы

Фрукты, как правило, можно употреблять в пищу, но разные виды фруктов употребляют по-разному.Яблоко, которое является фруктом, можно съесть (потому что это фрукт).Банан тоже можно есть (потому что это тоже фрукт), но не так, как яблоко.Сначала ты очисти его от кожуры.

Ну, по крайней мере, я знаю, но я странный в некоторых манерах, так что откуда мне знать.

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

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

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

На самом деле, существует множество форм полиморфизма, и по этому поводу существует немало споров;вы даже можете увидеть профессоров CS, которые не могут правильно это определить.Я знаю о трех типах:

  • специальный полиморфизм (выглядит как утка и ходит как утка => является уткой).Это можно увидеть, например, в Haskell и Python.

  • универсальный полиморфизм (где тип является экземпляром некоторого универсального типа).Это можно увидеть, например, в C ++ (вектор int и вектор string оба имеют размер функции-члена).

  • полиморфизм подтипов (когда тип наследуется от другого типа).Может быть замечен в большинстве языков программирования OO (т. е.Треугольник - это Фигура).

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

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

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

Определение:

Полиморфизм - это слово стоимостью 10 долларов за идею стоимостью 1 доллар. Когда я прошу что-то сделать, мне все равно, как это достигается, главное, чтобы конечный результат был подходящим.До тех пор, пока Обслуживание предоставляется правильно, я мне все равно о том, что реализация.

Обсуждение

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

Примеры

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

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

Несколько реализаций одного и того же интерфейса.

Пример:Многие модели телефонов реализуют интерфейс цифровой клавиатуры.

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

Ладно, это сложно....

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

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

Специальный полиморфизм

Специальный полиморфизм это акт предоставления нескольких реализаций одного и того же метода для разных типов параметров.В ООП, это обычно известно как перегрузка метода.Например:

public String format(int a) {
    return String.format("%2d", a);
}

public String format(Date a) {
    return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(a);
}

И то , и другое format методы разделяют единый интерфейс, но они работают с объектами различные типы.

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

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

Например, Java-это List[T] ожидает параметр T во время создания экземпляра, и этот параметр определяет тип результирующего объекта.

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

List[String] и List[Date] поделиться с единый интерфейс, но работаем над этим (и работаем) различные типы.

Полиморфизм подтипов

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

Воспользуемся обычным примером: Animal предоставляет контракт, который должны соблюдать все реализации. Dog является Animal, и как таковой поддерживает все операции , которые Animal заявляет.В соответствии с Принцип замещения Лискова, это позволяет вам использовать экземпляр Dog где экземпляр Animal ожидается (но не наоборот).

Если Cat и Dog являются обоими подклассами Animal, затем они разделяют единый интерфейс но таковы на самом деле различные типы.

Здесь я немного отклоняюсь от темы, но полиморфизм подтипов - это (я думаю) единственное, что позволяет переопределяющий:акт переопределения поведения метода, определенного родительским классом.Это часто путают с перегрузка который, как мы видели ранее, является типом полиморфизма и на самом деле не нуждается в подклассах (на самом деле ему не нужны классы).

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

Пол.

полиморфизм == несколько классов + одинаковые сигнатуры методов + поведение, зависящее от конкретного класса.

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

Существует два вида полиморфизма:

1. Compile-time (static) polymorphism or (ad hoc) polymorphism.

Это просто перегрузка метода и оператора

2.  Run time or (dynamic) polymorphism.

Первый семестр унаследован от терминологии Java и C++.

Но в .NET терминология только та, второй (Я имею в виду полиморфизм во время выполнения) действительно предполагается как полиморфизм и просто называется полиморфизм.

И насколько я знаю, существует три метода реализации (время выполнения) полиморфизм.

 1. Parametric polymorphism or simply the use of generics (templates in C++).

 2. Inheritance-based polymorphism or subtyping.

 3. Interface-based polymorphism.

Простой пример полиморфизма на основе интерфейса:

interface Imobile
{
    void Move();
}

class Person :Imobile
{
    public void Move() { Console.WriteLine("I am a person and am moving in my way."); }
}

class Bird :Imobile
{
    public void Move() { Console.WriteLine("I am a bird and am moving in my way."); }
}

class Car :Imobile
{
    public void Move() { Console.WriteLine("I am a car and am moving in my way."); }
}


class Program
{

    static void Main(string[] args)
    {
        // Preparing a list of objects
        List<Imobile> mobileList = new List<Imobile>();

        mobileList.Add(new Person());
        mobileList.Add(new Bird());
        mobileList.Add(new Car());

        foreach (Imobile mobile in mobileList)
        {
            mobile.Move();
        }

        // Keep the console open
        Console.WriteLine("Press any key to exit the program:");
        Console.ReadKey();
    }
}

Выходной сигнал:

 I am a person and am moving in my way.
 I am a bird and am moving in my way.
 I am a car and am moving in my way.
 Press any key to exit the program:

Множественные формы одного объекта называются полиморфизмом.

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

Полиморфизм - это особенность языков программирования, которая позволяет рассматривать объект как экземпляр его супертипа.

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

Полиморфизм

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

Через:http://www.agiledata.org/essays/objectOrientation101.html

Это определение, которому я всегда следовал:

Два объекта являются полиморфными (по отношению к определенному протоколу) между собой, если оба отвечают на одни и те же сообщения с одинаковой семантикой.

Полиморфизм связан с сообщениями, с возможностью отвечать на один и тот же набор сообщений с одинаковой семантикой.

Если два объекта МОГУТ реагировать на empty?но тогда смысл сообщения другой..они не являются полиморфными.

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

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

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

( Типы, поддерживаемые C ++, перечислены и сопоставлены в моем ответе: Полиморфизм в c++ )

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

Вы можете определить список следующим образом:

List list = new List();

но если вы проверите наличие IList, вы можете воспользоваться преимуществами интерфейса как:

IList list = new List();

и используйте IList ссылайтесь свободно.Предполагая IList также реализован в другом классе, вы можете снова использовать методы этого неизвестного класса через IList ссылайтесь, не пытаясь запомнить это имя класса.Чудесно, не правда ли?

Теперь поступает более ценная информация:
Java по умолчанию полиморфна, в то время как .NET и C ++ таковыми не являются, в MS вы должны объявить базовую функцию virtual (и в .NET override ключевое слово).

Кроме того, в полиморфизме есть 2 неотъемлемых правила.Одним из них является наследование (через интерфейс impl.или через расширение класса), а другой является переопределяющим.Без переопределения полиморфизма не существует.Обратите внимание, что перегрузка метода (которая всегда выполняется в одном классе) также является разновидностью "минималистичного" полиморфизма.

Для данной сигнатуры метода выполняются различные реализации метода для разных, иерархически связанных классов.

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

Т. е.:В Java, поскольку ArrayList и LinkedList реализуют List, если вы объявляете переменную как List, вы всегда можете выполнить операции, разрешенные в List , независимо от того, была ли ваша переменная создана как ArrayList или LinkedList .

Сущности одного и того же типа (то есть реализованные с одним и тем же интерфейсом или производные от одного и того же класса) ведут себя по-разному (под одним и тем же именем метода).

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

Я предполагаю, что иногда объекты вызываются динамически.Вы не уверены, будет ли объект представлять собой треугольник, квадрат и т.д. Классической формы poly.пример.

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

Вам было бы все равно, квадрат это, треугольник или прямоугольник.Вы просто заботитесь об этом районе.Следовательно, метод getArea будет вызываться в зависимости от переданного динамического объекта.

Полиморфизм - это способность функции автоматически адаптироваться для приема входных данных различных типов.Вы можете "Добавить" два дубля "1.1" и "2.2" и получить "3.3" или "Добавить" две строки "Stack" и "Overflow" и получить "StackOverflow".

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top