Полиморфизм - перегрузка / переопределение - PullRequest
3 голосов
/ 13 февраля 2011

Я знаю, что этот вопрос был задуман до смерти в StackOverflow и что уже есть множество вопросов по этому вопросу. Я, наверное, прочитал каждый из них, и тем не менее, есть одно нерешительное сомнение : Мне кажется, я хорошо понимаю Перегрузку и Переопределение. Что меня заводит, так это полиморфизм.

Например, принятый ответ на этот вопрос объясняет это shape.Draw(). Я не понимаю, как это отличается от переопределения (иногда я не понимаю, как это отличается от перегрузки).

Кроме того, означает ли полиморфизм по своей природе происхождение от абстрактного класса? (Я думаю, что почти во всех ответах, которые я прочитал по этой теме, используется класс абстрактных животных, и кошка и собака мяукают / лают:)

Подводя итог , мои вопросы:

  1. Что такое полиморфизм w.r.t. Перегрузка и переопределение?

  2. Может кто-нибудь объяснить Полиморфизм без абстрактного класса - спасибо!

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

Отредактировано для добавления третьего вопроса и изменения второго вопроса.

Ответы [ 3 ]

7 голосов
/ 13 февраля 2011

Чтобы ответить на ваши вопросы:

  1. Это возможность выбирать более специализированные методы в время выполнения в зависимости от объекта, который используется для его вызова.
  2. Ofкурс.Полиморфизм может возникнуть без участия абстрактных классов.
  3. Нет, перегрузка / переопределение не являются типами полиморфизма.

Вот пример с полиморфизмом, происходящим без абстракциизадействованные классы.

// non abstract
class A
{
    public void a()
    {
        System.out.println("Hello from A");
    }
}

class B
   extends A
{
    @Override
    public void a()
    {
        System.out.println("Hello from B");
    }
}

class C
{
    public static void SomeStatic(A a)
    {
         // HERE IS WHERE POLYMORPHISM OCCUR
         a.a();
    }
}

Полиморфизм в классе C происходит потому, что метод SomeStatic может быть вызван с ссылкой на объект или ссылкой на объект B .Если он вызывается со ссылкой на A , будет вызван A метод a.Если он вызывается со ссылкой на B , будет вызван метод B a.Эта способность изменять во время выполнения фактический вызываемый метод называется Полиморфизм .

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

Переопределение , с другой стороны, просто переопределяет метод вспециализированный (унаследованный) класс. Переопределение метод необходим для полиморфизма.В противном случае во время выполнения не будет ДВОЙНЫХ ВОЗМОЖНОСТЕЙ (внимательно посмотрите на пример).

Класс C - ключ к пониманию всего этого:

class Main
{
    public static void main(String[] args)
    {
        A a = new A();
        B b = new B();
        C.SomeStatic(a); // will call A's a
        C.SomeStatic(b); // will call B's a
        // AND THIS IS POLYMORPHISM
        // C will decide WHICH METHOD TO CALL 
        // only at runtime
    }
}

Поли : происходит от Греческий .Значит много . Morph : происходит от греческого .Означает форма .

Так что в Полиморфизм имеется "много" ( поли ) "формы" ( morph ) вызова метода.Какой из них будет вызываться, зависит от объекта, используемого для вызова метода.

1 голос
/ 13 февраля 2011

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

И перегрузка, и переопределение - это особый тип полиморфизма:

  • Перегрузка называется adhoc-полиморфизм.
  • Переопределение используется в ориентации объекта для полиморфизма типов для реализации различного поведения на подклассах.
0 голосов
/ 11 сентября 2016

Полиморфизм - это концепция ООП, в которой одна задача выполняется разными способами. Например. Вы можете оплатить счет дебетовой картой, через интернет-банк.

бывает двух типов:

1) Полиморфизм времени компиляции: который вызывает статическое связывание (метод сопоставления подписи, используемый компилятором для сопоставления подписи). Перегрузка операторов, перегрузка функций на самом деле способ реализации полиморфизма времени компиляции.

2) Полиморфизм времени выполнения: который вызывает динамическое связывание. Переопределение (переопределение метода в последующих подклассах) - это способ реализации полиморфизма во время выполнения.

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