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


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

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

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

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

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

30 78

30 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Обсуждение

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

примеры

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

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

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

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

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

ок, это трудно....

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

Павел.

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

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

это довольно общий, но это единственный способ, который я могу придумать, чтобы обернуть все три типа полиморфизмов, о которых я знаю: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

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

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

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

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

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

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

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

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

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

вы можете определить список как следует:

List list = new List();

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

IList list = new List();

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

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

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

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

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

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

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

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

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

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

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

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

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