Переопределение одной и той же функции для разных подклассов - это полиморфизм? - PullRequest
0 голосов
/ 03 апреля 2012

Я где-то читал, что переопределение - это средство, с помощью которого вы получаете полиморфизм. Полиморфизм - это способность объекта изменять поведение в зависимости от его типа.

Теперь я могу просто сказать, что когда разные подклассы переопределяют член родительского класса, это дает мне полиморфизм?

Также

class A
{
public void hello()
{
printf("in A");
}
}

class B extends A
{
public void hello()
{
printf("in B");
}
}

class C extends A
{
public void hello()
{
printf("in C);
}
}

Теперь, если я сделаю

B b=new B();
C c=new C();
A a1=b;
A a2=c;
a1.hello();
a2.hello();

теперь a1 будет использовать все члены b, которые унаследованы от A, и, следовательно, print in B; и аналогично для а2?

Ответы [ 3 ]

1 голос
/ 04 апреля 2012

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

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

Полиморфизм - это способность объекта варьироваться. поведение в зависимости от его типа.

Не обязательно. например В классе Animal реализован метод Eat (через Mouth), и этот класс, скажем, имеет множество подклассов. Ни одному из подклассов не нужно переопределять этот метод, если они не едят перорально. Таким образом, подклассы не реализуют метод Eat и все еще могут найти полиморфизм, который Dog является Animal.

Теперь я могу просто сказать, что когда разные подклассы переопределяют член родительского класса, то это дает мне полиморфизм?

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

 YOUR CODE

Вы можете попробовать это сами.

0 голосов
/ 03 апреля 2012

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

Классическим примером является базовый класс Shape, который определяет интерфейс (например, одна из функций может быть .area()), из которых у нас есть производные классы Square и Circle, которые оба реализуют свои собственные версии. интерфейса Shape (например, каждый может выбрать собственные расчеты .area()). Если у нас есть коллекция объектов Shape, мы можем работать с ними, не вдаваясь в детали:

area = 0
for shape in shapes:
    area += shape.area()  # dispatches to specific shape's area() function
0 голосов
/ 03 апреля 2012

Посредством наследования класс может использоваться как более одного типа; он может использоваться как свой собственный тип, любые базовые типы или любой тип интерфейса, если он реализует интерфейсы Полиморфизм важен не только для производных классов, но и для базовых классов. Любой, кто использует базовый класс, может фактически использовать объект производного класса, который был приведен к типу базового класса.

Другими словами, у вас есть полиморфизм каждый раз, когда вы используете базовый класс, у вас может быть «различное» поведение. Переопределение это просто способ иметь полиморфизм, но подумайте об интерфейсе, вы не переопределяете никакие методы, кроме вас все еще может иметь полиморфизм (реализация интерфейса по-разному)

...