Я изо всех сил пытаюсь получить эту точку. В Java я могу использовать тип класса Parent, используя оператор new с экземпляром класса Child.
Допустим, у меня есть класс Parent Human и классы Male and Female Child.
Я знаю, что они находятся в отношениях IS-A, потому что Мужчина - это Человек, а Женщина - это человек.
Я знаю, что только методы, определенные в Human и переопределенные в Male / Female, могут использоваться с типом Human И экземпляром Male / Female.
Но вопрос в том, почему я хотел бы использовать Human в качестве типа экземпляра Male / Female (child)?
Я пробовал пример класса "Типы", который создает объект типа "Человек". Чтобы метод Male-> humanType (или Female-> humanType) работал, мне пришлось объявить метод Human-> humanType, который ничего не делает.
Единственное, о чем я мог подумать, это то, что, делая это, я могу передать параметр Human методу (сигнатура метода, т.е. Human h1), который является как мужским, так и женским, но для того, чтобы этот код работал, я должен объявляйте в классе Human ВСЕ методы, которые я объявляю в обоих классах Male / Female, которые в классе Human ничего не делают (аналогично абстрактным методам).
class Types {
public static void main(String[] args) {
Types t1 = new Types();
Human p1 = new Male("Ugo");
t1.getHumanType(p1);
}
public void getHumanType(Human human) {
human.humanType();
}
}
class Human {
String name;
Human(String name) {
this.name = name;
}
public void humanType() { }
}
class Male extends Human {
Male(String name) {
super(name);
}
public void humanType() {
System.out.println("Im a Male");
}
}
class Female extends Human {
Female(String name) {
super(name);
}
public void humanType() {
System.out.println("Im a Female");
}
}
Это хороший способ бегать?
Я просто хочу лучше понять такую возможность, которую предлагает Java (я думаю, это называется поздним / ранним связыванием), потому что я не совсем понимаю ее. Разве абстрактный класс Human не был более правильным?