Понятие помощи, полиморфизм [дубликат]

Вы также можете использовать соединения, используя потрясающий пакет dplyr Хэдли Уикхэма].

library(dplyr)

#make sure that CustomerId cols are both type numeric
#they ARE not using the provided code in question and dplyr will complain
df1$CustomerId <- as.numeric(df1$CustomerId)
df2$CustomerId <- as.numeric(df2$CustomerId)

Мутирующие соединения: добавьте столбцы в df1 с помощью совпадений в df2

#inner
inner_join(df1, df2)

#left outer
left_join(df1, df2)

#right outer
right_join(df1, df2)

#alternate right outer
left_join(df2, df1)

#full join
full_join(df1, df2)

Фильтрация соединений: отфильтровать строки в df1, не изменять столбцы

semi_join(df1, df2) #keep only observations in df1 that match in df2.
anti_join(df1, df2) #drops all observations in df1 that match in df2.

460
задан Peter Mortensen 7 August 2014 в 20:24
поделиться

27 ответов

Если вы думаете о греческих корнях этого термина, это должно стать очевидным.

  • Poly = many: polygon = многогранный, полистирол = много стиролов (a), polyglot = many языки и т. д.
  • Morph = изменение или форма: морфология = изучение биологической формы, Morpheus = греческий бог сновидений способен принимать любую форму.

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

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

Но таким же образом класс, подобный BigDecimal или Rational или Imaginary, может также обеспечивать эти операции, даже если они работают на разных типах данных.

Классическим примером является класс Shape и все классы, которые могут наследовать его (квадрат, круг, додекаэдр, нерегулярный многоугольник, знак и т. д.).

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

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

shape.Draw()

, чтобы получить правильное поведение для любой формы.

Это в отличие от старого способа делать вещи, в которых код был отделен от данных, и у вас были бы такие функции, как drawSquare() и drawCircle().

Ориентация объектов, полиморфизм и наследование - все тесно связанных с ними концепций, и они важны для понимания. В течение моей долгой карьеры было много «серебряных пуль», которые в основном просто выдохлись, но парадигма ОО оказалась хорошей. Изучите его, поймите, полюбите его - вы будете рады, что вы это сделали: -)


(a) Я изначально написал это как шутку, но оказалось, что это правильно, и, следовательно, не так уж смешно. Момермер-стирол происходит из углерода и водорода C8H8, а полистирол производится из групп этого (C8H8)n.

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

Иногда вам нужно просто уйти, пока вы находитесь: -)

463
ответ дан paxdiablo 21 August 2018 в 01:41
поделиться
  • 1
    Греческий, а не латинский :) («y» и «ph» являются подарками). И в греческом языке «morph-» just 'shape' или 'form' - английское значение ' change shape' для 'morph' - это более поздняя разработка – AakashM 23 June 2009 в 10:26
  • 2
    Полиморфизм не связан с ООП, но ООП связан с полиморфизмом, потому что он по своей сути поддерживает его (предполагая его достойный язык ООП). Посмотрите на FP для других примеров полиморфизма. – alternative 16 April 2011 в 21:27
  • 3
    Эти две линии сделали для меня трюк: Poly = many and Morph = change or form – Jo Smo 13 May 2014 в 10:48
  • 4
    Полип не подходит для polypo (u) s. И pous - нога в греческом. ;-) – Dirk 12 October 2016 в 14:21
  • 5
    @Shaun, я думаю, вы можете использовать термин «интерфейс». в слишком литеральном / сужающем смысле - я имел в виду это как английский термин, а не определение, определенное для какого-либо произвольного компьютерного языка. Это не означает точно такую ​​же функцию с точно такими же параметрами, это просто способ воздействия на «объекты». таким же образом, независимо от их конкретного конкретного типа. Это может включать перегрузку метода с различными типами параметров, а также более чистую форму полиморфизма. – paxdiablo 18 April 2017 в 03:21

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

Обработка производного типа, как если бы это был базовый тип.

Есть много примеров выше, которые показывают это в действии, но я считаю, что это хороший краткий ответ.

6
ответ дан Abe Miessler 21 August 2018 в 01:41
поделиться
  • 1
    Это подтипирование, которое является лишь одним видом полиморфизма. – Shaun Luttin 29 January 2017 в 02:06
  • 2
    @ShaunLuttin вы можете указать мне на какие-либо ресурсы, чтобы узнать больше о других типах полиморфизма? – Abe Miessler 29 January 2017 в 02:08
  • 3
    Полимеры «ad hoc» и "параметрический полиморфизм" в дополнение к «полиморфизму подтипов». – Shaun Luttin 29 January 2017 в 02:17
  • 4
    Вот ресурс для вас: wiki.c2.com/?CategoryPolymorphism – Shaun Luttin 29 January 2017 в 03:04
  • 5
    Ницца - спасибо за информацию @ShaunLuttin – Abe Miessler 29 January 2017 в 23:38

Из Понимание и применение полиморфизма в PHP , спасибо Стиву Гидетти.

Полиморфизм - это длинное слово для очень простого понятия.

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

Красота полиморфизма заключается в том, что код, работающий с разными классами, не должен знать, какой класс он использует так как все они используются одинаково. Аналогом реального мира для полиморфизма является кнопка. Всем известно, как использовать кнопку: вы просто нажимаете на нее. Однако кнопка «делает» зависит от того, с чем она связана, и от контекста, в котором она используется, но результат не влияет на ее использование. Если ваш босс говорит вам нажимать кнопку, у вас уже есть вся информация, необходимая для выполнения задачи.

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

178
ответ дан Ajay Patel 21 August 2018 в 01:41
поделиться
  • 1
    это не аналогия кнопки, связанная больше с концепцией абстракции? – thewpfguy 29 March 2013 в 05:53
  • 2
    Исходный источник: code.tutsplus.com/tutorials/… – Someone 16 March 2015 в 15:14
  • 3
    @Mantriur: Это действительно плагиат, и у нас есть правила против этого: stackoverflow.com/help/referencing Но учитывая его оценку сейчас и тот факт, что старые сообщения освобождаются от потери репутации при удалении ответа, я «Не знаю, удалил бы его сейчас прямо, что-то улучшило бы. Следующей лучшей альтернативой было бы просто отредактировать атрибуцию от имени пользователя, хотя я твердо верю, что пользователи несут ответственность за цитирование источников в своих собственных ответах. – BoltClock♦ 16 March 2015 в 16:10
  • 4
    Я полагаю, что неверно подразумевать, что полиморфизм специфичен для классов и / или объектно-ориентированного программирования, видя, как специальный полиморфизм или параметрический полиморфизм не обязательно требуют классов и / или объектов. Я думаю, что этот ответ говорит о подтипировании (также известном как полиморфизм подтипа или полиморфизм включения). – StubbornShowaGuy 18 October 2016 в 06:54

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

//  Class definitions

class Fraction
{
    public $numerator;
    public $denominator;

    public function __construct($n, $d)
    {
        //  In real life, you'd do some type checking, making sure $d != 0, etc.
        $this->numerator = $n;
        $this->denominator = $d;
    }

    public function display()
    {
        echo $this->numerator . '/' . $this->denominator;
    }
}

class ComplexNumber
{
    public $real;
    public $imaginary;

    public function __construct($a, $b)
    {
        $this->real = $a;
        $this->imaginary = $b;
    }

    public function display()
    {
        echo $this->real . '+' . $this->imaginary . 'i';
    }
}


//  Main program

$fraction = new Fraction(1, 2);
$complex = new ComplexNumber(1, 2);

echo 'This is a fraction: '
$fraction->display();
echo "\n";

echo 'This is a complex number: '
$complex->display();
echo "\n";

Выходы:

This is a fraction: 1/2
This is a complex number: 1 + 2i

Некоторые из других ответов, по-видимому, подразумевают, что полиморфизм используется только совместно с наследованием; например, возможно, Fraction и ComplexNumber реализуют абстрактный класс, называемый Number, который имеет метод display(), который обеим обязательным образом реализуют Fraction и ComplexNumber. Но вы не нуждаетесь в наследовании , чтобы воспользоваться полиморфизмом.

По крайней мере, на динамически типизированных языках, таких как PHP (я не знаю о C ++ или Java), полиморфизм позволяет разработчик вызывать метод, не зная тип объекта раньше времени, и полагая, что будет вызвана правильная реализация метода. Например, пользователь выбирает тип созданного Number:

$userNumberChoice = $_GET['userNumberChoice'];

switch ($userNumberChoice) {
    case 'fraction':
        $userNumber = new Fraction(1, 2);
        break;
    case 'complex':
        $userNumber = new ComplexNumber(1, 2);
        break;
}

echo "The user's number is: ";
$userNumber->display();
echo "\n";

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

2
ответ дан Alex Basson 21 August 2018 в 01:41
поделиться
  • 1
    Это не полиморфизм. Это два класса, имеющие методы с тем же именем. Они должны быть связаны базовым классом или интерфейсом, называемым «отображаемым». или что-то похожее, а затем другие методы просто заботятся о том, чтобы объект имел тип "отображаемый" а не комплекс или фракция. – Pod 23 June 2009 в 10:22
  • 2
    Я всегда считал, что полиморфизм был ", причем два класса имеют методы одного и того же нома. Фактически, чтобы процитировать Стефана Кочана (от которого я бесстыдный, срывая этот пример фракции / комплекса), «способность делиться одним и тем же именем метода в разных классах называется полиморфизмом». (from Programming_In_Objective-C ). Он не упоминает о необходимости связывать классы через базовый класс. Может быть, это разные языки на разных языках, я честно не знаю. – Alex Basson 23 June 2009 в 10:37
  • 3
    Даже жесткое это ограничение цитируется из опубликованной книги, я бы все же утверждал, что это неверно. Тем более, что он, похоже, сталкивается с любым другим, языковым агностическим дефинированием полиморфизма. И хотя конечный результат такой же, как и при полиморфизме, я бы сказал, что вместо динамического набора текста программист может заставить зациклиться на том, что правильная реализация метода среди других аналогичных названных методов вызывается. – vipirtti 23 June 2009 в 11:15

Простое объяснение по аналогии

Президент Соединенных Штатов использует полиморфизм. Как? Ну, у него есть много советников:

  1. Военные советники
  2. Юридические советники
  3. Ядерные физики (в качестве советников)
  4. Медицинские консультанты
  5. и т. д. и т. д.

Каждый должен отвечать только за одно: Пример:

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

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

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

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

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

Есть ли лучший подход?

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

Он может использовать полиморфный подход к запуску страны.

Пример - использование полиморфного подхода:

Все президенты спрашивает людей, чтобы советовать ему - и это то, что он на самом деле делает в реальной жизни - и это то, что должен делать хороший президент. его советники все реагируют по-разному, но все они знают, что означает президент, путем: Advise (). У него сотни человек, которые вливаются в его кабинет. На самом деле не важно, кто они. Все, что президент знает, это то, что, когда он просит их «посоветоваться», они знают, как реагировать соответственно :

public class MisterPresident
{
    public void RunTheCountry()
    {
        // assume the Petraeus and Condi classes etc are instantiated.
        Petraeus.Advise(); // # Petraeus says send 100,000 troops to Fallujah
        Condolezza.Advise(); // # she says negotiate trade deal with Iran
        HealthOfficials.Advise(); // # they say we need to spend $50 billion on ObamaCare
    }
}

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

Что вы DON «T хотите:

public class MisterPresident
{
    public void RunTheCountry()
    {
        // people walk into the Presidents office and he tells them what to do
        // depending on who they are.

        // Fallujah Advice - Mr Prez tells his military exactly what to do.
        petraeus.IncreaseTroopNumbers();
        petraeus.ImproveSecurity();
        petraeus.PayContractors();

        // Condi diplomacy advice - Prez tells Condi how to negotiate

        condi.StallNegotiations();
        condi.LowBallFigure();
        condi.FireDemocraticallyElectedIraqiLeaderBecauseIDontLikeHim();

        // Health care

        healthOfficial.IncreasePremiums();
        healthOfficial.AddPreexistingConditions();
    }
}

НЕТ НЕТ НЕТ! сценарий, президент делает всю работу: он знает об увеличении численности войск и ранее существовавших условиях. Это означает, что, если политика среднего Востока изменится, тогда президент должен будет изменить свои команды , а также класс Петреуса. Нам остается только изменить класс Петреуса, потому что президенту не нужно увязываться в деталях. Ему не нужно знать подробностей. Все, что ему нужно знать что если он сделает один заказ, все будет позабочено. Все детали должны быть предоставлены экспертам.

Это позволяет президенту делать то, что он делает лучше всего: установить общую политику, хорошо выглядеть и играть в гольф: P.

Как это реализовано - через базовый класс или общий интерфейс

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

Другими словами, Петреус, Конди и HealthOfficials - это все классы, которые «реализуют интерфейс» - назовем его интерфейсом IAdvisor, который содержит только один метод: Advise(). Но теперь мы вникаем в специфику.

Это было бы идеально

    public class MisterPresident
    {
            // You can pass in any advisor: Condi, HealthOfficials, Petraeus etc. The president has no idea who it will be. But he does know that he can ask them to "advise" and that's all Mr Prez cares for.
        public void RunTheCountry(IAdvisor governmentOfficer)
        {             
            governmentOfficer.Advise();              
        }
    }


    public class USA
    {
        MisterPresident president;

        public USA(MisterPresident president)
        {
            this.president = president;
        }

        public void ImplementPolicy()
        {
            IAdvisor governmentOfficer = getAdvisor(); // Returns an advisor: could be condi, or petraus etc.
            president.RunTheCountry(governmentOfficer);
        }
    }

Резюме

Все, что вам действительно нужно знать, это следующее:

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

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

17
ответ дан BKSpurgeon 21 August 2018 в 01:41
поделиться
  • 1
    Фантастический пример! Благодарю. – Iman Sedighi 9 January 2017 в 10:06
  • 2
    Очень интересная аналогия. Спасибо. – thanhtang 16 August 2017 в 02:33
  • 3
    @ T.T.T. потому что (1) каждый раз, когда у вас есть новый советник, вам придется изменить класс президента - вы не хотите делать изменения x2. только один. (2) во-вторых, если вам нужно изменить существующего советника, вам, возможно, придется вернуться и изменить один из этих трех вызовов в классе президента - вы действительно хотите сделать одно изменение, а не два. (3) если у вас было три отдельных звонка, тогда вам нужно будет спросить, в рамках класса президента: if healthAdvisor? then do this: и if petraus then do that etc. этот шаблон необходимо будет повторить, а это не обязательно и сложно. см. выше. – BKSpurgeon 26 January 2018 в 00:53
  • 4
    @ T.T.T. да ты прав. но я должен медленно вводить понятие читателям, иначе они не поймут. Я добавил дальнейшие изменения. пожалуйста, сообщите, если необходимы разъяснения – BKSpurgeon 26 January 2018 в 01:10
  • 5
    @ T.T.T. базовый класс vs interface - это проектное решение, которое программисты должны делать при выполнении полиморфизма. см. здесь для более подробной информации: stackoverflow.com/questions/56867/interface-vs-base-class – BKSpurgeon 26 January 2018 в 01:42

Используем аналогию.

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

Если вы слушатель музыкальной работы, у вас есть ссылка на сценарий, например «Fuga и Tocata» Баха и каждый музыкант, который его выполняет, делает это полиморфно по-своему.

Это всего лишь пример возможного дизайна (на Java):

public interface Musician {
  public void play(Work work);
}

public interface Work {
  public String getScript();
}

public class FugaAndToccata implements Work {
  public String getScript() {
    return Bach.getFugaAndToccataScript();
  }
}

public class AnnHalloway implements Musician {
  public void play(Work work) {
    // plays in her own style, strict, disciplined
    String script = work.getScript()
  }
}

public class VictorBorga implements Musician {
  public void play(Work work) {
    // goofing while playing with superb style
    String script = work.getScript()
  }
}

public class Listener {
  public void main(String[] args) {
    Musician musician;
    if (args!=null && args.length > 0 && args[0].equals("C")) {
      musician = new AnnHalloway();
    } else {
      musician = new TerryGilliam();
    }
    musician.play(new FugaAndToccata());
}
2
ответ дан Boris Pavlović 21 August 2018 в 01:41
поделиться

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

0
ответ дан Brian Scott 21 August 2018 в 01:41
поделиться

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

Вот пример в C #. Создайте четыре класса в консольном приложении:

public abstract class Vehicle
{
    public abstract int Wheels;
}

public class Bicycle : Vehicle
{
    public override int Wheels()
    {
        return 2;
    }
}

public class Car : Vehicle
{
    public override int Wheels()
    {
        return 4;
    }
}

public class Truck : Vehicle
{
    public override int Wheels()
    {
        return 18;
    }
}

Теперь создайте в основном () модуля для консольного приложения следующее:

public void Main()
{
    List<Vehicle> vehicles = new List<Vehicle>();

    vehicles.Add(new Bicycle());
    vehicles.Add(new Car());
    vehicles.Add(new Truck());

    foreach (Vehicle v in vehicles)
    {
        Console.WriteLine(
            string.Format("A {0} has {1} wheels.",
                v.GetType().Name, v.Wheels));
    }
}

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

Затем мы добавим в список велосипед, автомобиль и грузовик.

Затем мы можем прокрутить каждое транспортное средство в списке и относиться к ним одинаково одинаково, однако, когда мы обращаемся к каждому типу транспортных средств, Класс транспортного средства делегирует выполнение этого кода соответствующему подклассу.

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

Надеюсь, это вам поможет.

207
ответ дан Charles Roper 21 August 2018 в 01:41
поделиться
  • 1
    Я думаю, что это очень хороший пример для четкого отображения родительского интерфейса, и только после того, как объект будет создан, требуется конкретная версия, то есть автомобиль против автомобиля – wired00 30 October 2014 в 03:09
  • 2
    Я бы сказал, что это самый яркий пример, хотя, если вы программист PHP, эта ссылка может быть проще просмотреть FIRST, а затем по-прежнему смотреть на нее после: code.tutsplus.com/tutorials/… – Oliver Williams 6 January 2017 в 20:50
  • 3
    Также (за пределами OP), чтобы отметить, что мы ограничиваем анализ известных объектов; мы не передаем объект (например, файл импорта), а затем определяем, какой он тип (Excel, CSV, YAML, SQL и т. д.). Для этого понадобится какой-то заводский класс для Class_Excel, Class_CSV, который должен быть вызван, или вызванный класс Reader. В любом случае, некоторая итеративная, если / then / else придется где-то хранить. – Oliver Williams 6 January 2017 в 20:54
  • 4
    @Antony Gibbs: это действительно хороший пример (список типичных типов), который имеет смысл для меня .... иначе в чем заключается большая роль того, чтобы каждый класс имел свою собственную функцию колес, не наследуя от базового класса? Есть ли еще какие-то понятия, кроме списка, которые были бы хороши для полиморфных? – T.T.T. 26 January 2018 в 00:21

Я представил обзор высокого уровня полиморфизма для другого вопроса:

Полиморфизм в c ++

Надеюсь, что это поможет. Экстракт ...

... он помогает начать с простого теста для него и определения [полиморфизма]. Рассмотрим код:

Type1 x;
Type2 y;

f(x);
f(y);

Здесь f() выполняет некоторую операцию и ему присваиваются значения x и y в качестве входов. Чтобы быть полиморфным, f() должен иметь возможность работать со значениями по меньшей мере двух разных типов (например, int и double), находить и выполнять код, соответствующий типу.

(продолжение в Полиморфизм в c ++ )

2
ответ дан Community 21 August 2018 в 01:41
поделиться

В объектно-ориентированных языках полиморфизм позволяет обрабатывать и обрабатывать разные типы данных через один и тот же интерфейс. Например, рассмотрим наследование в C ++: класс B является производным от класса A. Указатель типа A * (указатель на класс A) может использоваться для обработки как объекта класса A, так и объекта класса B.

0
ответ дан Eran Rehavi 21 August 2018 в 01:41
поделиться

Полиморфизм => Различное исполнение в соответствии с экземпляром класса, а не тип ссылочной переменной.

Контрольная переменная типа интерфейса может ссылаться на любой экземпляр класса, который реализует этот интерфейс.

1
ответ дан Hassan Tareq 21 August 2018 в 01:41
поделиться

Обычно это относится к способности объекта типа A вести себя как объект типа B. В объектно-ориентированном программировании это обычно достигается путем наследования. Некоторые ссылки на wikipedia:

EDIT: фиксированные неработающие ссылки.

8
ответ дан JesperE 21 August 2018 в 01:41
поделиться
  • 1
    "способность объекта типа A вести себя как объект типа B" - Это не точное определение. Я бы сказал, что это больше похоже на способность обрабатывать объект типа A, подобный объекту типа B. – Artem Barger 23 June 2009 в 09:27
  • 2
    Да. Может быть, это лучшая фраза. – JesperE 23 June 2009 в 09:37
  • 3
    Для полноты много языков реализуют полиморфизм посредством утиного набора текста, например. Python. – ilya n. 29 June 2009 в 17:40
  • 4
    Интересно, как это связано с (популярным) объяснением, которое @Ajay Patel дал classes have different functionality while sharing a common interface – BornToCode 5 May 2014 в 11:46

(я просматривал другую статью о чем-то совершенно другом .. и появился полиморфизм ... Теперь я подумал, что знаю, что такое Полиморфизм ... но, видимо, не так красиво объяснили .. Хотел записать его где-то еще лучше поделится им ...)

http://www.eioba.com/a/1htn/how-i-explained-rest-to-my-wife

читать из этой части:

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

6
ответ дан Kcats Wolfrevo 21 August 2018 в 01:41
поделиться

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

Помните, что каждый класс должен быть сохранен в отдельных файлах.

Следующий код иллюстрирует полиморфизм:

SuperClass:

public class Parent {
    //Define things that all classes share
    String maidenName;
    String familyTree;

    //Give the top class a default method
    public void speak(){
         System.out.println("We are all Parents");
    }
}

Отец, подкласс:

public class Father extends Parent{
    //Can use maidenName and familyTree here
    String name="Joe";
    String called="dad";

    //Give the top class a default method
    public void speak(){
        System.out.println("I am "+name+", the father.");
    }
}

Ребенок, другой подкласс:

public class Child extends Father {
    //Can use maidenName, familyTree, called and name here

    //Give the top class a default method
    public void speak(){
        System.out.println("Hi "+called+". What are we going to do today?");
    }
}

Метод выполнения, ссылается на родительский класс:

public class Parenting{
    public static void main(String[] args) {
        Parent parents = new Parent();
        Parent parent = new Father();
        Parent child = new Child();

        parents.speak();
        parent.speak();
        child.speak();
    }
}

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

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

0
ответ дан Midimistro 21 August 2018 в 01:41
поделиться
  • 1
    обратите внимание, что каждый ребенок не является родителем, поэтому эта структура неверна. Высший класс должен быть дочерним (если вы не только начинаете с «Person»), который всегда будет истинным, кроме Адама. Вы можете установить его parent_id равным null, поскольку Творца нельзя определить с помощью какой-либо конструкции человеческого интеллекта. – Yehosef 9 November 2014 в 11:13

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

public class PolymorphismExample {

    public static abstract class Vehicle
    {
        public int wheels(){
            return 0;
        }
    }

    public static class Bike extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 2;
        }
    }

    public static class Car extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 4;
        }
    }

    public static class Truck extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 18;
        }
    }

    public static void main(String[] args)
    {
        Vehicle bike = new Bike();
        Vehicle car = new Car();
        Vehicle truck = new Truck();

        System.out.println("Bike has "+bike.wheels()+" wheels");
        System.out.println("Car has "+car.wheels()+" wheels");
        System.out.println("Truck has "+truck.wheels()+" wheels");
    }

}

Результат:

Для получения дополнительной информации пожалуйста, посетите страницу https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/PolymorphismExample.java . Я надеюсь, что это помогает.

1
ответ дан Mohammad 21 August 2018 в 01:41
поделиться
  • 1
    Да, но вы не объяснили, какие преимущества полиморфизма. Очевидно, есть более короткий код, в котором вы бы удалили класс Vehicle, и он все равно будет работать (с другой декларацией объекта, конечно). – Cornelius 13 December 2016 в 12:00
  • 2
    Я не объяснял, так как человек, который задал вопрос, не спрашивал о преимуществах. Он спросил: «Что такое полиморфизм, для чего он нужен и как он используется?». О коде, если вы можете сделать это лучше, отправьте свой ответ. Таким образом, наше сообщество может использовать его. Спасибо за ваш комментарий. – Mohammad 14 December 2016 в 04:49
  • 3
    Извините, не хотелось звучать грубо, другие тоже не объяснили. По крайней мере, вам надо было вводить код. В любом случае, он спросил, для чего он нужен, но ни один из примеров на этой странице не объясняет, для чего это необходимо. Вы все просто представляете сложный способ получить те же результаты, что и этот: s28.postimg.org/jq8vl6031/Poly.jpg , и никто не заботился о том, чтобы объяснить, зачем нужно использовать полиморфизм, какова его прибыль или цели, что бы не было сделано, если оно не было использовано? Все, что я вижу на этой странице, - это предложение подняться в вашу квартиру, используя лестницу, а не лифт. – Cornelius 14 December 2016 в 09:51
  • 4
    .. не заметив, что у одного есть флаг, который слишком велик, чтобы соответствовать лифту. Я не знаю, как отправлять код, поэтому я не могу помочь ... – Cornelius 14 December 2016 в 09:52

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

Используя полиморфизм, модуль высокого уровня не зависит от модуля низкого уровня. Оба зависят от абстракций. Это помогает нам применить принцип инверсии зависимостей ( https://en.wikipedia.org/wiki/Dependency_inversion_principle ).

Здесь я нашел указанное выше определение. Примерно через 50 минут на видео инструктор объясняет это выше. https://www.youtube.com/watch?v=TMuno5RZNeE

0
ответ дан Raghav Navada 21 August 2018 в 01:41
поделиться

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

1
ответ дан Rohit 21 August 2018 в 01:41
поделиться

Если кто-нибудь говорит CUT этим людям

  1. Хирург
  2. Стилист для волос
  3. Актер

Что будет?

  • Хирург начнет делать надрез.
  • Парикмахер начнет резать чьи-то волосы.

Таким образом, над представлением показывает, что такое полиморфизм (то же имя, другое поведение) в ООП.

Если вы собираетесь на собеседование и интервьюер просит вас рассказать / показать живой пример полиморфизма в той же комнате, что мы сидим, скажем -

Ответ - дверь / Windows

Wondering Как?

Через дверь / окно - человек может прийти, может наступить воздух, может наступить свет, может наступить дождь и т. Д.

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

45
ответ дан Sanchit 21 August 2018 в 01:41
поделиться
  • 1
    Я не думаю, что это отличный пример, потому что это может заставить неопытных людей думать, что если у двух классов есть метод .foo(), то они должны иметь общий интерфейс. Однако это неверно и приводит к неправильным абстракциям. Интерфейс должен определить роль , которая должна быть воспроизведена, которая может иметь много разных реализаций, но все тянут от одного и того же набора ввода и возвращают что-то из того же набора выходных данных. Ввод в x.cut(...) для хирурга, стилиста или актера не является тем же, и ни один из них не является результатом. – Matt Klein 27 January 2017 в 06:49

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

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

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

См. также:

http://wiki.c2.com/?CategoryPolymorphism

https://en.wikipedia.org/wiki/Polymorphism_(computer_science)

1
ответ дан Shaun Luttin 21 August 2018 в 01:41
поделиться

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

1
ответ дан sjith 21 August 2018 в 01:41
поделиться

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

Рассмотрим человека X.

Он всего лишь один человек, но он действует как много. Вы можете спросить, как:

Он сын своей матери. Друг своим друзьям. Брат сестре.

2
ответ дан Sourov Datta 21 August 2018 в 01:41
поделиться

Вообще говоря, это возможность взаимодействовать с несколькими различными типами объектов, используя тот же или похожий на внешний вид API. Существуют различные формы:

  • Перегрузка функций: определение нескольких функций с одинаковым именем и разными типами параметров, таких как sqrt (float), sqrt (double) и sqrt (complex). В большинстве языков, которые позволяют это, компилятор автоматически выберет правильный для типа передаваемого в него аргумента, таким образом, это полиморфизм времени компиляции.
  • Виртуальные методы в ООП: метод класса могут иметь различные реализации, адаптированные к специфике его подклассов; каждый из них, как говорят, переопределяет реализацию, данную в базовом классе. Учитывая объект, который может быть базового класса или любого из его подклассов, правильная реализация выбирается «на лету», поэтому это полиморфизм во время выполнения.
  • Шаблоны: функция некоторых языков OO, посредством которой функция, класс и т. д. могут быть параметризованы типом. Например, вы можете определить общий шаблон шаблона «список», а затем создать его как «список целых чисел», «список строк», возможно, даже «список списков строк» ​​или тому подобное. Как правило, вы пишете код один раз для структуры данных произвольного типа элемента, а компилятор генерирует его версии для различных типов элементов.
2
ответ дан Stewart 21 August 2018 в 01:41
поделиться

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

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

Dog* dog = new Dog;
Animal* animal = dog;
19
ответ дан Tom Dalling 21 August 2018 в 01:41
поделиться
  • 1
    Интересно, как это связано с (популярным) объяснением, которое @Ajay Patel дал classes have different functionality while sharing a common interface – BornToCode 5 May 2014 в 11:44
  • 2
    @BornToCode Родительский класс / предоставляет этот общий интерфейс. – grokmann 8 August 2014 в 15:42
  • 3
    Полиморфизм не требует подтипирования. – Shaun Luttin 29 January 2017 в 02:01
  • 4
    @ tom-dalling: Я думал, собака уже унаследовала все от животного и может уже действовать как животное + собака? Какой в ​​этом смысл? Благодарю. – T.T.T. 26 January 2018 в 00:26

Полиморфизм:

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

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

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

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

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

Примеры:

Пример-1: Вот простой пример, написанный на Python 2.x.

class Animal:
    def __init__(self, name):    # Constructor of the class
        self.name = name
    def talk(self):              # Abstract method, defined by convention only
        raise NotImplementedError("Subclass must implement abstract method")

class Cat(Animal):
    def talk(self):
        return 'Meow!'

class Dog(Animal):
    def talk(self):
        return 'Woof! Woof!'

animals = [Cat('Missy'),
           Dog('Lassie')]

for animal in animals:
    print animal.name + ': ' + animal.talk()

Пример-2: Полиморфизм реализован на Java с использованием перегрузки методов и переопределения методов.

Рассмотрим пример автомобиля для обсуждения полиморфизма. Возьмите любой бренд, такой как Ford, Honda, Toyota, BMW, Benz и т. Д. Все это типа Car.

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

Теперь давайте создадим базовый тип Car

Car.java

public class Car {

    int price;
    String name;
    String color;

    public void move(){
    System.out.println("Basic Car move");
    }

}

Давайте воспользуемся примером Ford Car.

Ford расширяет тип Автомобиль наследует все его элементы (свойства и методы).

Ford.java

public class Ford extends Car{
  public void move(){
    System.out.println("Moving with V engine");
  }
}

Вышеупомянутый класс Ford расширяет класс Car, а также реализует метод move (). Несмотря на то, что метод перемещения уже доступен Форду через Наследование, Ford по-прежнему реализовал метод по-своему. Это называется переопределением методов.

Honda.java

public class Honda extends Car{
  public void move(){
    System.out.println("Move with i-VTEC engine");
  }
}

Как и Ford, Honda также расширяет тип автомобиля и применяет метод перемещения по-своему.

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

PolymorphismExample.java

public class PolymorphismExample {
  public static void main(String[] args) {
    Car car = new Car();
    Car f = new Ford();
    Car h = new Honda();

    car.move();
    f.move();
    h.move();

  }
}

Результат вывода полиморфизма:

В основном методе класса PolymorphismExample я создал три объекта - автомобиль, Ford и Honda. Все три объекта относятся к типу автомобиля.

Обратите внимание на важный момент здесь, что тип суперкласса может относиться к типу объекта класса Sub, но наоборот. Причина в том, что все члены суперкласса доступны для подкласса с использованием наследования и во время компиляции компилятор пытается оценить, использует ли ссылочный тип метод, к которому он пытается получить доступ.

Итак, для ссылок car, f и h в примере PolymorphismExample метод перемещения существует из типа Car. Таким образом, компилятор передает процесс компиляции без каких-либо проблем.

Но когда дело доходит до выполнения времени выполнения, виртуальная машина вызывает методы для объектов, которые являются подтипами. Таким образом, метод move () вызывается из их соответствующих реализаций.

Итак, все объекты имеют тип Car, но во время выполнения выполнение зависит от объекта, на котором происходит вызов. Это называется полиморфизмом.

20
ответ дан Tony Stark 21 August 2018 в 01:41
поделиться
  • 1
    Концепция перегрузки не имеет ничего общего с наследованием и полиморфизмом. – srk 8 January 2017 в 11:41
  • 2
    @srk Перегрузка метода - один из способов реализации полиморфизма. Он часто классифицируется как статический или специальный полиморфизм. wiki.c2.com/?CategoryPolymorphism – Shaun Luttin 29 January 2017 в 03:06

Термин полиморфизм исходит из:

poly = many

морфизм = способность к изменению

В программировании полиморфизм - это «метод», который позволяет вы «смотрите» на объект как нечто большее, чем одно. Например:

Объект-ученик также является объектом-человеком. Если вы «посмотрите» (то есть набросок) на ученика, вы, возможно, можете запросить идентификатор студента. Вы не всегда можете сделать это с человеком, не так ли? (человек не обязательно является студентом, поэтому у него может не быть студенческого удостоверения). Однако у человека, вероятно, есть имя. Студент тоже.

Нижняя строка, «глядя» на один и тот же объект с разных «углов», может дать вам разные «перспективы» (т. е. различные свойства или методы)

Таким образом, этот метод позволяет создавать вещи которые можно «смотреть» под разными углами.

Почему мы используем полиморфизм? Для начала ... абстракция. На этом этапе должно быть достаточно информации:)

3
ответ дан tzup 21 August 2018 в 01:41
поделиться

Полиморфизм таков:

class Cup {
   int capacity
}

class TeaCup : Cup {
   string flavour
}

class CoffeeCup : Cup {
   string brand
}

Cup c = new CoffeeCup();

public int measure(Cup c) {
    return c.capacity
}

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

7
ответ дан Vinko Vrsalovic 21 August 2018 в 01:41
поделиться
  • 1
    Это специфический подтип полиморфизма. – Shaun Luttin 29 January 2017 в 02:05
  • 2
    @ vinko-vrsalovic: что такое разработка программного обеспечения, как в сельской Америке? – T.T.T. 26 January 2018 в 00:44

Полиморфизм в ООП означает, что класс может иметь разные типы, наследование является одним из способов реализации полиморфизма.

, например, Shape - это интерфейс, он имеет подтипы Square, Circle, Diamond. теперь у вас есть объект Square, вы можете автоматически увеличивать квадрат до формы, потому что Square - это форма. Но когда вы пытаетесь склонить Shape to Square, вы должны делать явное титье, потому что вы не можете сказать, что Shape is Square, это может быть Circle. поэтому вам нужно вручную бросить его с кодом, как Square s = (Square)shape, что, если форма Circle, вы получите java.lang.ClassCastException, потому что Circle не является квадратом.

2
ответ дан Zakaria Braksa 21 August 2018 в 01:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: