В чем основное различие между наследованием и полиморфизмом?
Я был представлен с этим вопросом в конце модуля открытой книги экзамена сегодня и оказался потерянным. Я читал Head first Javaи оба определения казались совершенно одинаковыми. Мне просто было интересно, что главное различие было для моего собственного ума. Я знаю, что есть ряд подобных вопросов, но ни один из них я не видел, которые дают окончательный ответ.
15 ответов:
наследование-это когда "класс", производный от существующего класса. Так что если у вас есть
Personкласс, то у вас естьStudentкласс, который расширяетPerson,Studentнаследует все то, чтоPersonесть. Есть некоторые детали вокруг модификаторов доступа, которые вы ставите на поля/методы лично, но это основная идея. Например, если у вас есть личное поле наPerson,Studentне будет видеть его, потому что его частные и частные поля не видны подклассы.полиморфизм имеет дело с тем, как программа решает, какие методы она должна использовать, в зависимости от того, какой тип вещи он имеет. Если у вас есть
Person, которая имеетreadметод, и у вас естьStudentкоторая расширяетPerson, который имеет свою собственную реализациюread, какой метод вызывается для вас во время выполнения, в зависимости от того, если у вас естьPersonилиStudent. Это становится немного сложнее, но если вы делаете что-то вродеPerson p = new Student(); p.read();читать метод студент вызывается. Это полиморфизм в действии. Вы можете сделать это задание, потому что
StudentэтоPerson, но среда выполнения достаточно умна, чтобы знать, что фактический типpи студент.обратите внимание, что детали отличаются между языками. Вы можете сделать наследование в javascript, например, но его полностью отличается от того, как он работает в Java.
наследование относится к используя структуру и поведение суперкласса в подклассе.
полиморфизм относится к изменение поведения суперкласса в подклассе.
полиморфизм: возможность обрабатывать объекты разных типов аналогичным образом. Пример: жираф и Крокодил оба Животные, и животные могут
Move. Если у вас есть экземплярAnimalзатем вы можете позвонитьMoveне зная и не заботясь о том, что это за животное.наследование: это один из способов достижения полиморфизма и повторного использования кода одновременно.
другие формы полиморфизма: Там существуют и другие способы достижения полиморфизма, такие как интерфейсы, которые обеспечивают только полиморфизм, но не повторное использование кода (иногда код совсем другой, например
Moveдля Змеи было бы совсем не так, какMoveдля собаки, и в этом случае интерфейс был бы лучшим полиморфным выбором в этом случае.в других динамических языках полиморфизм может быть достигнут с помощью Duck Typing, то есть классам даже не нужно использовать один и тот же базовый класс или интерфейс, им просто нужно метод с тем же именем. Или даже более динамичный, как Javascript, вам даже не нужны классы вообще, просто объект с тем же именем метода может использоваться полиморфно.
основное отличие заключается в том, что полиморфизм является специфическим результатом наследования. Полиморфизм-это когда вызываемый метод определяется во время выполнения на основе типа объекта. Это ситуация, которая возникает, когда один класс наследуется от другого и переопределяет определенный метод. Однако в обычном дереве наследования нет необходимости переопределять какие-либо методы, и поэтому не все вызовы методов должны быть полиморфными. Это имеет смысл? Это аналогичная проблема для всех Автомобили Ford-это автомобили, но не все автомобили-это Форды (хотя и не совсем....).
кроме того, полиморфизм имеет дело с вызовом метода, тогда как наследование также описывает элементы данных и т. д.
в 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, есть функция перебирать их и вызывать функцию, и каждый будет вести себя просто отлично. У вас будет свой собственный полиморфный рисунок без необходимости наследования.
полиморфизм: Предположим, вы работаете в компании, которая продает ручки. Таким образом, Вы делаете очень хороший класс под названием "ручка", который обрабатывает все, что вам нужно знать о ручке. Вы пишете всевозможные классы для выставления счетов, доставки, создания счетов-фактур, все используя класс Pen. Однажды приходит босс и говорит: "отличные новости! Компания растет и мы продаем книги и компакт-диски теперь!"Не очень хорошая новость, потому что теперь вы должны изменить каждый класс, который использует перо, чтобы также использовать книгу и компакт-диск. Но что делать, если вы изначально создал интерфейс под названием "SellableProduct", и Pen реализовал этот интерфейс. Тогда вы могли бы написать все свои классы доставки, выставления счетов и т. д., Чтобы использовать этот интерфейс вместо пера. Теперь все, что вам нужно сделать, это создать новый класс под названием Book & CompactDisc, который реализует интерфейс SellableProduct. Из-за полиморфизма все остальные классы могут продолжать работать без изменений! Есть Смысл?
Итак, это означает использование наследования, которое является одним из способов добиться полиморфизма.
полиморфизм может быть возможен в классе / интерфейсе, но наследование всегда между 2 или более классами / интерфейсами. Наследование всегда соответствует соотношению" есть-а", тогда как оно не всегда связано с полиморфизмом (который может соответствовать как соотношению" есть-а " / "имеет-а".
наследование-это скорее статическая вещь (один класс расширяет другой), в то время как полиморфизм-это динамическая/ runtime вещь (объект ведет себя в соответствии со своим типом dynamic/ runtime, а не с его типом static/ declaration).
например.
// This assignment is possible because B extends A A a = new B(); // polymorphic call/ access a.foo();-> хотя статический / тип объявления a является A, фактический тип dynamic / runtime является B и, следовательно, a. foo() будет выполнять foo, как определено в B, а не в A.
полиморфизм-это подход к выражению общего поведения между типами объектов, которые имеют сходные черты. Он также позволяет создавать вариации этих признаков путем переопределения. Наследование-это способ достижения полиморфизма через иерархию объектов, где объекты выражают отношения и абстрактное поведение. Это не единственный способ достижения полиморфизма. Прототип-это еще один способ выражения полиморфизма, отличный от наследования. JavaScript является примером язык, который использует прототип. Я бы предположил, что есть и другие способы.
наследование-это понятие, связанное с повторным использованием кода. Например, если у меня есть родительский класс сказать
Animalи он содержит определенные атрибуты и методы (для этого примера скажемmakeNoise()иsleep()) и я создаю два дочерних класса под названиемDogиCat. Поскольку и собаки, и кошки ложатся спать одинаково (я бы предположил), нет необходимости добавлять больше функциональности вsleep()методDogиCatподклассы, предоставляемые родительским классомAnimal. ОднакоDogлает иCatмяукает так, хотяAnimalкласс может иметь метод для создания шума, собака и кошка делают разные шумы относительно друг друга и других животных. Таким образом, возникает необходимость переопределить это поведение для их конкретных типов. Таким образом, определение полиморфизма. Надеюсь, это поможет.
документация Oracle точно указала разницу.
наследование: класс наследует поля и методы из всех его суперклассов, прямых или косвенных. подкласс может переопределять методы, которые он наследует, или он может скрывать поля или методы, которые он наследует. (Обратите внимание, что скрытие полей, как правило, плохая практика программирования.)
полиморфизм:полиморфизм относится к принципу в биологии, в котором организм или вид может иметь много различных форм или стадий. Этот принцип также может быть применен к объектно-ориентированному программированию и таким языкам, как язык Java. подклассы класса могут определять свое собственное уникальное поведение и при этом совместно использовать некоторые из тех же функций родительского класса.
полиморфизм не применяется для полей.
обзоры сообщение:
наследование - это когда класс A наследует все нестатические защищенные / открытые методы / поля от всех своих родителей до объекта.
Если вы используете JAVA, это так просто:
полиморфизм использует унаследованные методы, но" переопределяет " их, чтобы сделать что-то другое (или то же самое, если вы называете super so технически не полиморфным).
поправьте меня, если я ошибаюсь.
основная цель полиморфизм : для создания ссылочной переменной к супер класс и удерживая подкласс объект => объект может выполнять несколько поведений.
на наследование,подкласс наследовать свойства супер класс.
наследование является своего рода полиморфизмом, именно на самом деле наследование является динамическим полиморфизмом. Таким образом, при удалении наследования вы не можете переопределить больше.
полиморфизм достигается с помощью наследование на
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также демонстрируют полиморфных бихевиоризм домашнего питомца.
Comments