Ответ 1
Да, это так. А почему бы и нет?
Потому что ребенок на самом деле является экземпляром Parent. Если вы хотите выполнить операцию только для ребенка, вы должны проверить
if (child instanceof Child){
}
Однако вы должны помнить следующее высказывание Скотта Мейерса из Effective C++:
"Каждый раз, когда вы обнаруживаете, что пишете код формы", если объект имеет тип T1, тогда что-то делаете, но если он имеет тип T2, тогда делайте что-то еще ", шлепните себя.
что я думаю, применимо и в этом случае. Если вы хотите сделать что-то в зависимости от того, к какому классу относится объект, на который ссылаются, вам поможет следующая структура кода.
ПРИМЕЧАНИЕ: я не скомпилировал его.
class Parent {
public void doSomething() {
System.out.println("I am the Parent, and I do as I like");
}
}
class ChildA extends Parent {
public void doSomething() {
System.out.println("I am a child named A, but I have my own ways, different from Parent");
}
}
class ChildB extends Parent {
public void doSomething() {
System.out.println("I am a child named B, but I have my own ways, different from my Parent and my siblings");
}
}
public class Polymorphism101 {
public static void main(String[] args) {
Parent p = new Parent();
p.doSomething();
p = new ChildA();
p.doSomething();
p = new ChildB();
p.doSomething();
}
}
РЕДАКТИРОВАТЬ: лучший пример
Вы могли бы разработать приложение для рисования. Приложение, которое рисует фигуры любого вида. В этом случае у вас должен быть абстрактный тип Shape
.
Для целей, как; рисование всех форм; перечислите все формы; найти форму или удалить форму, вам нужно иметь список фигур. Поскольку список имеет родительский тип, он может хранить любые фигуры.
Интерфейс Shape
/абстрактный класс/виртуальный класс должен иметь абстрактную/чисто виртуальную функцию Draw()
. Итак, в вашем DrawToDeviceLoop вы просто вызываете Draw()
для каждой фигуры, вам никогда не нужно проверять, какая это фигура.
Интерфейс Shape
может иметь абстрактную реализацию AbstractShape
, которая может иметь имя или идентификатор фигуры в качестве членов данных, а также GetName, Cleanup и другие функции с функциями, общими для всех фигур.
Помните, что абстрактный тип не может быть создан, поэтому сам Shape
не может быть создан, так как он также не может быть нарисован.