Подтвердить что ты не робот

В чем разница между абстракцией и полиморфизмом

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

Спасибо.

4b9b3361

Ответ 1

Абстрактные

Представьте класс фракций:

class fraction:
    int denominator
    int numerator

Теперь два объекта этого:

fraction(obj1): denominator=-1 numerator=-1
fraction(obj2): denominator=1  numerator=1

Оба объекта имеют значение 1: (1/1) == (-1)/(-1). Вы не ожидаете, что они будут отличаться от внешних. Это абстракция. Вы абстрагируете данные, которые ваш объект держит в логическом виде, даже за кулисами, есть и другие вещи. Теоретически у вас есть отношение эквивалентности с разными группами эквивалентности:

[1]=(1, 1), (-1, -1), (5, 5), ...
[2]=(2, 4), (-2, -4), ...
...

И есть функция абстракции, которая абстрагирует внутренние детали снаружи:

f((1, 1)) = [1]
f((-1, -1)) = [1]

Он отображает из конкретных значений абстрактные значения объекта. Вы делаете это, записывая, например, сопоставление конструктора (-1, -1) в (1, 1) и записывая равную функцию для вашего класса.

Полиморфизм

Представьте себе перо и два производных класса:

class pen:
    void draw(int x, int y)

class pen_thin extends pen:
    void draw(int x, int y) { color(x, y) = green; }

class pen_thick extends pen:
    void draw(int x, int y) { color(x, y) = green; 
                              color(x, y+1) = green; }
and two objects:
    pen_thin(p1)
    pen_thick(p2)

Оба ручки могут рисовать. ваше общее "перо" не может рисовать себя. Это просто интерфейс для pen_thin, pen_thick и множества других ручек. Вы говорите: obj1.draw(1, 0); и является ли obj1 толстым или тонким пером для вас не как пользователь, ни для компилятора во время компиляции. Вызов ведет себя полиморфно. Это динамический полиморфизм (происходит во время выполнения) и то, что люди обычно имеют в виду. Статический полиморфизм происходит во время компиляции:

class colorizer:
    void colorize(shirt s)
    void colorize(pants p)

Это называется перегрузкой. Вы вызываете obj.colorize(something). Если вы назовете его ссылкой на рубашку, он будет называть версию с рубашкой. И если вы назовете его ссылкой с трусом, он будет вызывать версию брюк. Выбор делается здесь во время компиляции.

Ответ 2

Эти два являются одними из наиболее важных характеристик объектно-ориентированной парадигмы.

Абстрактные.

Ориентация объектов моделирует программное обеспечение как объекты реального мира. Однако было бы слишком сложно (и бесполезно) моделировать ВСЕ свойства, которые может иметь Клиент, или все свойства, которыми располагает Сотрудник.

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

Например, Employee в системе HR может иметь очень разные атрибуты, чем в Online BookStore. Мы абстрагируем детали, которые нужно сделать полезными.

полиморфизм.

Объекты могут вести себя по-разному в зависимости от типа, сохраняя один и тот же интерфейс.

Что это значит?

Например, система интернет-магазина может иметь два подкласса Employee

A) Внутренние сотрудники.

B) Подрядчики

И метод расчета скидок для внутренних покупок

Скидка внутреннего сотрудника рассчитывается как: 10% + 2% за каждый отработанный год в компании + 2% для каждого.. mmhh child

Скидка подрядчика составляет 10%

Следующий код для расчета суммы платежа:

 public Amount getAmountToPay( Product product, Employee internalCustomer ) { 
      Amount amount = product.getPrice();
      amount.applyDiscount( internalCustomer.getDiscount() );
      return amount;
 }

Произведет разные результаты для двух разных типов сотрудников

class Employee { 
    public int getDiscount();
}


class InternalEmployee extends Employee { 
     public int getDiscount() { 
        return 10 + 2 * getWorkedYears() + 2 * getNumberOfChilds();
     }
 }

 class Contractor extends Employee { 
      public int getDiscount() { 
          return 10;
     }
 }

Это полиморфизм в действии. Вместо того, чтобы что-то вроде

 Amount amount = product.getPrice();

 if( employee.isContractor() ) { 
      amount.applyDiscount( 10 );
 } else if( employee.isSomthingElse() ) {
      amount.applyDiscount( 10 * 2 * getYrs() + 2 * getChilds() );
 } else if ( employee.contidions, condigions, conditions ) {
      amount.applyDiscount( getSomeStrageRuleHere() );
 }

Мы позволяем runtime выбирать, какой из них рассчитывать. Похоже, что программа ведет себя по-разному в зависимости от типа:

      Amount amount = product.getPrice();
      amount.applyDiscount( internalCustomer.getDiscount() );
      return amount;

Кстати, в этом примере "Сумма" представляет собой абстракцию концепции реальной жизни, которая также может быть представлена ​​как двойная или целочисленная, но, возможно, у нас есть методы оценки внутри, что было бы лучше, если бы она была установлена ​​в ее собственный класс.

Надеюсь, это поможет.

Ответ 3

Абстракция и полиморфизм являются критическими понятиями, не ограничиваясь ОО. Добавляя к путанице, слово "абстракция" используется несколькими способами. Вот быстрый лист читов с одним примером:

  • Абстракция данных означает скрытие информации. Обычно скрытым является представление структуры данных. Пример. Я реализую наборы, но я не говорю вам, представлен ли набор как список, сбалансированное двоичное дерево или несбалансированное двоичное дерево. Сделано правильно, Я могу изменить представление, не нарушая ваш код.

  • Полиморфизм означает повторное использование с различными типами. Таким образом, с моим примером, вы можете создавать наборы номеров социального страхования, наборы полных имен или наборы фруктовых ботов, все с использованием того же кода.

Очевидно, вы можете определить класс, который является абстрактным и полиморфным.

Полиморфизм еще более запутан, потому что существует два способа реализации полиморфизма. В параметре параметрического полиморфизма вы можете повторно использовать набор со значениями любого типа или, возможно, любого типа, удовлетворяющего некоторому ограничению. наиболее очевидные примеры - шаблоны С++; если вы пишете

class Set <T> { ... }

Тогда T - это тип объектов, содержащихся в наборе (обозначение <T> указывает на так называемый "параметр типа", что делает его параметрическим полиморфизмом).

В политике подтипа вы можете повторно использовать наборы только с объектами, типы которых являются подтипами определенного типа. Например, вы можете создавать наборы только объектов, которые предлагают метод меньше или равный. В истинно объектно-ориентированном языке, таком как Smalltalk или Ruby, который предлагает так называемую утиную печать (мы, теоретики с заостренным голосом, иногда называем это поведенческим подтипированием), наличие метода достаточно хорошее. На языке, таком как Java или С++, который связывает подтипирование с наследованием, ваше использование полиморфизма может быть ограничено подклассами определенного класса. (Java еще больше смущает проблему, используя одну форму подтипирования для классов и другую на интерфейсах.)

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

Итак, вам лучше смущаться?

Ответ 4

Абстракция относится к акту представления основных функций без включения фоновых деталей или объяснений. Классы используют понятие абстракции и определяются как список абстрактных атрибутов.

Одним из примеров абстракции программного обеспечения является метод Java Object.equals(Object o). Вы знаете, что он будет сравнивать этот объект с тем, который был передан как параметр, но вы не знаете и не знаете, как именно он будет реализован (если вы не являетесь разработчиком этого класса).

Полиморфизм означает способность принимать более одной формы. Метод может иметь разные типы поведения в разных случаях. Поведение зависит от типов данных, используемых в операции.

В одном из классических примеров полиморфизма используется дерево наследования, внедренное в класс Animal. Все животные имеют метод makeNoise(), но класс Dog и класс Cat реализуют его по-разному. Это позволяет вам ссылаться на любую собаку и кошку, используя ссылочный тип Animal.

Animal a = new Dog();
Animal b = new Cat();

Теперь вы можете вызвать makeNoise() на экземпляр Animal и знать, что он сделает соответствующий шум. Это особенно полезно, если у вас есть коллекция животных, и во время выполнения вы не знаете, какой тип на самом деле есть.

Ответ 5

Оба термина сильно используются в объектно-ориентированном программировании, но они специально не ограничиваются этим контекстом.

Абстракция - это обобщение чего-то другого; шаг выше в перспективе. Например, иерархию можно рассматривать как абстракцию организационной структуры компании. Как правило, он используется в контексте того, что находится под ним (например, их базовые типы). Точка абстрагирования состоит в том, чтобы написать меньше кода, который является более общим по своей природе, так что вы можете запустить его для большего набора проблем. Например, электронная таблица представляет собой абстракцию, которая позволяет использовать определенный тип хранения информации. Подробнее?

Полиморфизм также является обобщением, но тем, что происходит в контексте выполнения. Букет из разных типов объектов является полиморфным, если есть какой-то способ доступа к ним, где они неотличимы друг от друга. То есть, все объекты выглядят и чувствуют то же самое, даже если это не так. Цель этого - значительно сократить код; вы можете написать одно обобщенное решение для сохранения от записи всех разных подстановок для каждого другого типа. Если вы пишете графическую библиотеку, вы скорее просто напишите какой-нибудь абстрактный код для обработки "фигур", а затем напишите код для каждого другого типа, например, круги, квадраты и т.д.

Это оба термина, которые сосредоточены вокруг свойств в коде, которые позволят программистам делать больше с меньшими затратами. Меньший код имеет меньше ошибок, более стабилен и удобен в обслуживании. Альтернативой является использование "грубой силы" для измельчения миллионов и миллионов строк очень специфического (и очень хрупкого) кода. Больше кода сложнее исправить, и гораздо сложнее поддерживать актуальность.

Павел.

Ответ 6

короткий ответ: абстракция концептуальна, полиморфизм - поведенческий

Ответ 7

Абстракция и полиморфизм схожи с природой с другой целью.

Например,

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

здесь Лицензия - это Абстрактный класс, а ее метод разрешенные транспортные средства - это Абстрактный метод.

Теперь, здесь, Полиморфизм - это разные способы, которыми индивидуальная Лицензия выделяется властью для разных людей, некоторые из них выдаются для легких транспортных средств, а некоторые - для тяжелых, а некоторые - для коммерческих автомобилей, согласно различным требованиям. Здесь Лицензия - это базовый класс, а другие виды лицензий - это его дочерние классы, также подчиняющиеся is-a relationship. Коммерческая лицензия - это лицензия.

Итак, абстракция - это общее руководство, дающее независимость реализации классам последователей, в то время как полиморфизм - это дифференциальный подход, который переопределяет методы/правила, установленные родительским классом.

Ответ 8

P.S: недавно начал изучать java-ответ, основанный на моем наблюдении, пожалуйста, исправьте меня, если я ошибаюсь.

Абстракция и полиморфизм в основном в глубине делают почти ту же работу в программировании.

Позвольте взять автомобиль, например..

Не имеет значения, является ли это мини-фургон Ford, экзотический Ferrari, внедорожник Land-Rover или седан BMW, все они следуют базовому дизайну автомобиля, то есть двигателю, рулевому колесу, коробке передач, огни, индикаторы и список. то, что делает их разными, - их конкретные реализации, такие как Ferrari, могут иметь более мощный двигатель, чем мини-фургон, у suv может быть другая коробка передач следовательно, автомобиль (Суперкласс здесь) был реализован подклассами (седан, сувь, мини-фургон, экзотика) Это полиморфизм, основная идея наследуется или реализуется путем добавления другой спецификации. 4-колесный автомобиль (суперкласс) реализуется в различных формах (подклассах).

Теперь Абстракция, по определению, это означает скрывать детали и заставлять пользователя видеть, что требуется от него.

Возьмите пример автомобиля снова.. Вы используете экипировку, но вы точно не знаете, как именно механизм работает и меняет скорость и все.

Теперь переходим к кодировке Part.

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

abstract class car {
  abstract void gear();
}

class sedan extends car {
 public void gear()
 {
  //complete the method
 }
}

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

Используя абстрактные классы или интерфейсы, мы можем добиться абстракции в Java. Как мы все знаем, что абстрактные классы, интерфейсы содержат абстрактные методы

Мы можем только оценить, как они будут работать. Мы узнаем, как они работают, как только мы предоставили реализацию метода в классах, которые реализуют соответствующий абстрактный класс или интерфейс.

HENCE, аннотация в основном помогает полиморфизму.

Ответ 9

Проще говоря, абстракция является концептуальной, а поли - поведенческой. Чтобы добиться абстракции в ООП, вам нужен Poly.

Я могу сказать, что абстракция в объектно-ориентированном программировании - это концепция или шаблон проектирования, который обеспечивает лучшую изоляцию, слабо связывая таким образом тестируемость, а также возможность повторного использования и расширяемости. Чтобы добиться всего, нам нужны поли, наследование/расширение и т.д.

Ответ 10

очень просто.

  • Абстракция - это абстракция. Класс "Студент" - это абстракция реального ученика.

  • Полиморфизм - это когда один класс представляет другой, чтобы пользователь не заметил. Это может произойти, когда классы реализуют один и тот же интерфейс или один класс происходит от другого. Класс "HighSchoolStudent" происходит от класса "Студент". Когда класс "Учитель" вызывает метод #attendance для объекта, он может не знать, относится ли этот объект к классу "Student" или "HighSchoolStudent".