Альтернативное определение полиморфизма - PullRequest
0 голосов
/ 16 марта 2012

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

SuperClass sc=new SubClass();

Это все равно что сказать: «Я бы хотел объект класса SuperClass, но я хочу, чтобы он вел себя как объект Subclass для переопределенных методов»?Спасибо за ваши ответы.

Ответы [ 7 ]

3 голосов
/ 16 марта 2012

Я не интерпретирую это точно так. Я бы сказал: «Я хочу объект SubClass, но он должен рассматриваться как SuperClass, чтобы не имело значения, какой именно подкласс».

То есть представьте, что у вас есть SubClass1 и SubClass2, реализующие оба метода, реализующие метод вычисления, вы хотите иметь возможность вызывать метод для всех из них, не зная точно, к какому классу они относятся, вы просто рассматриваете все из них как SuperClass. 1003 *

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

2 голосов
/ 16 марта 2012

Я думаю, легче понять, если быть конкретным.Рассмотрим:

Pet myPet = new Dog();

против:

Pet myPet = new Cat();

Какая разница?Если все, что вы знаете о своем питомце, это то, что это Pet, то вы не знаете, что именно произойдет, если вы позвоните:

myPet.beHappy();

В первом случае, возможно, будет реализовано beHappy()как this.wagTail();, тогда как во втором случае это может быть this.purr();.

Теперь вернитесь к исходному описанию и замените конкретные классы: «Я бы хотел питомца, но яхочу, чтобы он вел себя как собака [или кошка] за то, что он счастлив ». Будь это точное описание происходящего, я думаю, зависит от вашей перспективы.Конечно, у вас есть объект Pet, который ведет себя как объект Dog (или Cat).С другой стороны, можно было бы сказать: «Я бы хотел Собаку, но я хочу взаимодействовать с ней так же, как и с любым другим домашним животным». Это также правильное описание того, чтопроисходит.

Какое описание подходит?Они оба.Что предпочтительнее?Это просто зависит от того, с какой стороны оператора присваивания вы начинаете.

1 голос
/ 16 марта 2012

Я думаю, что вы понимаете правильно.

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

из http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

0 голосов
/ 16 марта 2012

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

Пример первый

Второй пример

0 голосов
/ 16 марта 2012

Ваше утверждение: «Мне нужен объект класса SuperClass, но я хочу, чтобы он вел себя как объект подкласса для переопределенных методов», это правильно, и это Полиморфизм подтипов

Вы также можете иметь полиморфизм, который реализует интерфейс.Одним из распространенных примеров является метод toString (), где каждый класс имеет похожее поведение (печать в виде строки)

См. Полиморфизм в ООП в Википедии для другого примера.

0 голосов
/ 16 марта 2012

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

Основное различие между типом времени компиляции и выполнениемтип времениВ этом случае sc имеет тип SuperClass во время компиляции, но во время выполнения он имеет SubClass (это, конечно, будет означать, что если вы не переопределите методы в SubClass соответствующие методы SuperClass будет выполнено, если вызвано).

0 голосов
/ 16 марта 2012

Мне нравится использовать идею Shapes.«Все треугольники - это фигуры, но не все фигуры - это треугольники».Все треугольники ведут себя как фигуры, но не все фигуры ведут себя как треугольники.

Например, у всех фигур есть площадь, но это не рассчитывается одинаковоКруги (подкласс или форма суперкласса), используйте формулу phi * r * r, но это не сработает для всех фигур (т.е. не все формы являются кругами).

...