В чем основное отличие между наследованием и полиморфизмом?

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Наследование. Это один из способов одновременного использования полиморфизма и повторного использования кода.

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

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

Ответ 4

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

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

Ответ 5

В 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 draw, polymorphic
testObject.spin(); // calls A spin, inherited by B
testObject.bad(); // compiler error, you are manipulating this as an A

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

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

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

Ответ 6

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

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

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

Ответ 7

Наследование больше статично (один класс расширяет другой), в то время как полиморфизм - это динамическое/время выполнения (объект ведет себя в соответствии с его типом dynamic/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.

Ответ 8

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

Ответ 9

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

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

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

Полиморфизм

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

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

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

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

Ответ 14

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

Ответ 15

Полиморфизм достигается наследованием в 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 () {}

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

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

Ответ 16

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

Например, пример полиморфизма Java:

enter image description here

Наследование позволяет производным классам совместно использовать интерфейсы и код своих базовых классов. Это происходит во время компиляции.

Например, все классы в платформе Java являются потомками объекта (изображение любезно предоставлено Oracle):

enter image description here

Чтобы узнать больше о наследовании Java и полиморфизме Java