В чем основное различие между наследованием и полиморфизмом? - PullRequest
152 голосов
/ 10 июня 2011

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

Ответы [ 16 ]

264 голосов
/ 10 июня 2011

Наследование - это когда «класс» наследуется от существующего «класса». Так что если у вас есть класс 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.

185 голосов
/ 10 июня 2011

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

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

58 голосов
/ 10 июня 2011

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

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

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

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

17 голосов
/ 10 июня 2011

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

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

12 голосов
/ 16 декабря 2012

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

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

Полиморфизм возможен в классе / интерфейсе, но наследование всегда между 2 ИЛИ несколькими классами / интерфейсами. Наследование всегда соответствует отношениям "есть-а", тогда как оно не всегда соответствует полиморфизму (который может соответствовать отношениям "есть-а" / "имеет-а")

12 голосов
/ 10 июня 2011

В 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 полиморфно.

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

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

6 голосов
/ 10 июня 2011

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

* 1003 Е.Г. *

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

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

3 голосов
/ 21 июля 2017

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

3 голосов
/ 22 сентября 2016

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

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

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

полиморфизм не являетсяприменимо для полей.

Похожие записи:

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

3 голосов
/ 10 июня 2011

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

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