Каково различие между Абстракцией и Полиморфизмом

простой способ использования библиотеки Aquery помогает получить изображение прямой загрузки с URL

AQuery aq=new AQuery(this); // intsialze aquery
 aq.id(R.id.ImageView).image("http://www.vikispot.com/z/images/vikispot/android-w.png");

30
задан Lawrence Dol 15 December 2008 в 02:20
поделиться

7 ответов

Абстракция

Воображает дробный класс:

class fraction:
    int denominator
    int numerator

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

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

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

[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). При вызове его со ссылкой рубашки это назовет версию, берущую рубашку. И если Вы назовете его со ссылкой пыхтения, то это назовет версию штанов. Выбор, сделанный здесь, во время компиляции .

26
ответ дан 27 November 2019 в 22:07
поделиться

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

Абстракция.

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

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

, Например, у Сотрудника в системе HR могут быть совсем другие атрибуты, чем BookStore Онлайн. Мы абстрагируем детали для создания, полезно.

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

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

, Что, это означает?

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

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

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

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

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

скидка подрядчика - 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;
     }
 }

, Это - полиморфизм в действии. Вместо того, чтобы иметь что-то как [1 120]

 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() );
 }

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

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

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

я надеюсь, что это помогает.

13
ответ дан 27 November 2019 в 22:07
поделиться

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

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

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

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

Полиморфизм дальнейший сбивающий с толку потому что существует два способа реализовать полиморфизм . В [1 123] параметрический полиморфизм , можно снова использовать набор со значениями [1 124] любой тип или возможно любой тип, удовлетворяющий некоторое ограничение. самые очевидные примеры шаблоны C++ ; если Вы пишете

class Set <T> { ... }

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

В [1 127] полиморфизм подтипа , можно снова использовать наборы только с объектами, типы которых являются подтипами конкретного типа. Например, Вы смогли делать наборы только объектов, которые предлагают less-than-or-equal-to метод. На истинном объектно-ориентированном языке как Smalltalk или Ruby, которые предлагают так называемый утка, вводящая (нас теоретики с заостренной головой иногда называют его поведенческое выделение подтипов ), присутствие метода достаточно хорошо. На языке как Java или C++, которые объединяют выделение подтипов с наследованием , Ваше использование полиморфизма может быть ограничено подклассами конкретного класса . (Java далее путает проблему при помощи одной формы выделения подтипов на классах и другого в интерфейсах.)

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

Так, Вы чувствуете себя лучше о том, чтобы быть перепутанным?

12
ответ дан 27 November 2019 в 22:07
поделиться

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

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

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

Один из классических примеров полиморфизма использует дерево наследования, базированное в классе Животных. Все Животное имеет makeNoise() метод, но класс Собаки и класс CAT реализуют его по-другому. Это позволяет Вам отсылать к использованию любой Собаки и CAT ссылочный тип Животных.

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

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

6
ответ дан 27 November 2019 в 22:07
поделиться

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

Абстракция является обобщением чего-то еще; шаг выше в перспективе. Иерархия, например, может рассматриваться как абстракция на организационной структуре компании. Обычно это используется в контексте того, что вещи внизу (такие как их базовые типы). Точка абстракции должна написать меньше кода, который является более общим по своей природе, так, чтобы можно было выполнить его для большего набора проблем. Электронная таблица, например, является абстракцией, которая допускает определенный тип хранения информации. [Еще 110]?

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

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

Paul.

4
ответ дан 27 November 2019 в 22:07
поделиться

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

3
ответ дан 27 November 2019 в 22:07
поделиться

очень легкий.

  1. Абстракция является абстракцией. Класс 'Студент' является абстракцией настоящего студента.

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

-4
ответ дан 27 November 2019 в 22:07
поделиться