В чем основное отличие между наследованием и polymorphismом?

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

Наследование – это когда «class» происходит от существующего «classа». Поэтому, если у вас есть class Person , у вас есть class Student который расширяет Person , Student наследует все, что имеет Person . Есть некоторые детали вокруг модификаторов доступа, которые вы помещаете в поля / методы в Person, но это основная идея. Например, если у вас есть личное поле Person , Student не увидит его, потому что его частные и частные поля не видны подclassам.

Полиморфизм имеет дело с тем, как программа решает, какие методы она должна использовать, в зависимости от того, что она имеет. Если у вас есть Person , у которой есть метод read , и у вас есть Student который расширяет Person , у которого есть своя реализация read , вызываемый метод определяется для вас средой выполнения, в зависимости от того, есть ли у вас Person или Student , Это немного сложно, но если вы делаете что-то вроде

 Person p = new Student(); p.read(); 

вызывается метод чтения на Student . Это polymorphism в действии. Вы можете выполнить это назначение, потому что Student – это Person , но среда выполнения достаточно умна, чтобы знать, что фактический тип p является Student .

Обратите внимание, что детали отличаются друг от друга. Например, вы можете наследовать в javascript, но это совершенно не так, как в Java.

Наследование относится к использованию структуры и поведения суперclassа в подclassе.

Полиморфизм относится к изменению поведения суперclassа в подclassе.

Полиморфизм : способность одинаково обрабатывать объекты разных типов. Пример: Жираф и Крокодил – это животные, а животные могут Move . Если у вас есть экземпляр Animal то вы можете вызвать Move не зная или не заботясь о том, какой тип животного он есть.

Наследование : это один из способов одновременно использовать как polymorphism, так и повторное использование кода.

Другие формы polymorphismа . Существуют и другие способы достижения polymorphismа, такие как интерфейсы, которые обеспечивают только polymorphism, но не используют повторное использование кода (иногда код совсем другой, например, Move for a Snake будет сильно отличаться от Move for a Dog, в в этом случае интерфейс был бы лучшим полиморфным выбором в этом случае.

В других динамических языках polymorphism может быть достигнут с помощью Duck Typing, для которого classам не требуется разделять один и тот же базовый class или интерфейс, им просто нужен метод с тем же именем. Или даже более динамичный, как Javascript, вам даже не нужны classы вообще, только объект с тем же именем метода может использоваться полиморфно.

Основное различие заключается в том, что polymorphism является конкретным результатом наследования. Полиморфизм – это то, где метод, который должен быть вызван, определяется во время выполнения на основе типа объекта. Это ситуация, которая возникает, когда у вас есть один class, наследующий от другого и переопределяющий конкретный метод. Однако в обычном дереве наследования вам не нужно переопределять какие-либо методы, и поэтому не все вызовы методов должны быть полиморфными. Имеет ли это смысл? Это аналогичная проблема для всех автомобилей Ford – это автомобили, но не все автомобили – это Форды (хотя и не совсем …).

Кроме того, polymorphism имеет дело с вызовом метода, тогда как наследование также описывает членов данных и т. Д.

В Java эти два тесно связаны между собой. Это связано с тем, что Java использует метод вызова метода, называемый «динамическая отправка». Если бы у меня был

 public class A { public void draw() { ... } public void spin() { ... } } public class B extends A { public void draw() { ... } public void bad() { ... } } ... A testObject = new B(); testObject.draw(); // calls B's draw, polymorphic testObject.spin(); // calls A's spin, inherited by B testObject.bad(); // compiler error, you are manipulating this as an A 

Затем мы видим, что B наследует spin от A. Однако, когда мы пытаемся манипулировать объектом, как если бы это был тип A, мы по-прежнему получаем поведение B для draw . Поведение при draw является полиморфным.

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

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

Полиморфизм. Предположим, вы работаете в компании, которая продает ручки. Таким образом, вы создаете очень хороший class под названием «Pen», который обрабатывает все, что вам нужно знать о ручке. Вы пишете все виды classов для выставления счетов, доставки, создания счетов-фактур, все с использованием classа Pen. Приходит дневной босс и говорит: «Отличные новости! Компания растет, и сейчас мы продаем книги и компакт-диски!» Не большие новости, потому что теперь вам нужно изменить каждый class, который использует Pen, чтобы также использовать Book & CD. Но что, если вы изначально создали интерфейс под названием «SellableProduct», а Pen реализовал этот интерфейс. Тогда вы могли бы написать все свои classы доставки, выставления счетов и т. Д., Чтобы использовать этот интерфейс вместо Pen. Теперь все, что вам нужно сделать, это создать новый class Book & CompactDisc, который реализует интерфейс SellableProduct. Из-за polymorphismа все остальные classы могут продолжать работать без изменений! Смысл?

Таким образом, это означает использование Наследования, которое является одним из способов достижения polymorphismа.

Полиморфизм может быть возможен в classе / интерфейсе, но наследование всегда между 2 или более classами / интерфейсами. Наследование всегда соответствует соотношению «есть-а», тогда как это не всегда с polymorphismом (который может соответствовать как «is-a» / «has-a».

Наследование больше статично (один class расширяет другой), а polymorphism – это динамическое / время выполнения (объект ведет себя в соответствии с его типом динамического / runtime, а не его статическим / декларационным типом).

Например

 // This assignment is possible because B extends A A a = new B(); // polymorphic call/ access a.foo(); 

-> Хотя статический / тип объявления a есть A, фактический тип динамического / runtime – это B и, таким образом, a.foo () выполнит foo, как определено в B, не в A.

Полиморфизм – это подход к выражению общего поведения между типами объектов, которые имеют сходные черты. Он также позволяет создавать вариации этих признаков посредством переопределения. Наследование – это способ достижения polymorphismа через иерархию объектов, где объекты выражают отношения и абстрактное поведение. Однако это не единственный способ добиться polymorphismа. Прототип – еще один способ выразить polymorphism, отличный от наследования. JavaScript – пример языка, который использует прототип. Я бы предположил, что есть и другие способы.

Наследование – это концепция, связанная с повторным использованием кода. Например, если у меня есть родительский class, скажите Animal и он содержит определенные атрибуты и методы (для этого примера скажите makeNoise() и sleep() ), и я создаю два дочерних classа Dog и Cat . Поскольку и собаки, и кошки уходят спать таким же образом (я бы предположил), нет необходимости добавлять больше функциональности к методу sleep() в подclassах Dog и Cat предоставляемых родительским classом Animal . Тем не менее, Dog лает и Cat мяукает, хотя class Animal может иметь способ шуметь, собака и кошка делают разные шумы относительно друг друга и других животных. Таким образом, необходимо переопределить это поведение для своих конкретных типов. Таким образом, определение polymorphismа. Надеюсь это поможет.

Документация Oracle точно указала разницу.

Наследование: class наследует поля и методы от всех своих суперclassов, будь то прямые или косвенные. Подclass может переопределять методы, которые он наследует, или может скрывать поля или методы, которые он наследует . (Обратите внимание: скрытые поля, как правило, плохо программируют.)

polymorphism: polymorphism относится к принципу в биологии, в котором организм или вид могут иметь много разных форм или стадий. Этот принцип также может быть применен к объектно-ориентированному программированию и языкам, таким как язык Java. Подclassы classа могут определять свое собственное уникальное поведение и совместно использовать одни и те же функциональные возможности родительского classа.

polymorphism не применим для полей.

Похожие сообщения:

Полиморфизм против переопределения и перегрузки

Наследование – это когда class А наследует все нестатические защищенные / общедоступные методы / поля от всех своих родителей до объекта.

Если вы используете JAVA, это так просто:

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

Поправьте меня если я ошибаюсь.

Основная цель polymorphismа : создать ссылочную переменную суперclassу и удерживать объект подclassа => объект может выполнять несколько действий .

В наследовании подclass наследует свойства суперclassа .

Наследование – это своего рода polymorphism. На самом деле наследование – это динамический polymorphism. Таким образом, когда вы удаляете наследование, вы больше не можете переопределять.

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

 public class Animal {} public interface Herbivore {} public interface Carnivore {} public interface Pet {} public class Hamster extends Animal implements Herbivore implements Pet () {} public class Cat extends Animal implements Carnivore implements Pet () {} 

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

Класс Cat наследует структуру от Animal , Carnivore и Pet а также демонстрирует полиморфный бихевиоризм домашнего домашнего животного.

  • Как определить закрытый class в C ++?
  • модификаторы доступа к Java и методы переопределения
  • Наследование конструктора Java
  • Почему не наследовать от List ?
  • Наследование и агрегирование
  • Что такое интерфейс в Java?
  • Как интерфейсы заменяют необходимость множественного наследования при наличии существующих classов
  • Когда использовать интерфейс вместо абстрактного classа и наоборот?
  • C # - создание всех производных classов вызывает конструктор базового classа
  • Наследование из списка
  • Как использовать конструкторы базового classа и оператор присваивания в C ++?
  • Interesting Posts

    Откат драйвера в Windows через командную строку

    Завершение работы и применение обновлений с OS X

    Можете ли вы установить Ubuntu Server в Windows PC VM на Windows 7?

    Определите, установлен ли доступ к библиотеке фотографий или нет – PHPhotoLibrary

    Лучше ли использовать ADO или DAO в Access 2007?

    Чтение нескольких файлов в несколько кадров данных

    Как получить название города из координат широты и долготы в Картах Google?

    Скопировать весь рабочий лист с помощью openpyxl

    C # «внутренний» модификатор доступа при выполнении модульного тестирования

    JAVA не может статически ссылаться на нестатические поля

    Почему массив не присваивается Iterable?

    Могу ли я заметить разницу между 7200 об / мин и жестким диском емкостью 5400 об / мин?

    Что означает эта ошибка WCF: «Предупреждение о настраиваемом инструменте: невозможно импортировать wsdl: portType»

    OS X «Смертельная спираль»? Невозможно запустить новые процессы, в конечном итоге становится непригодным

    Получить абсолютное положение элемента внутри windows в wpf

    Давайте будем гением компьютера.