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



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

1344   15  

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

    Ничего не найдено.