#java #ооп #наследование #полиморфизм
Использование дочернего класса в качестве родительского класса
Важным аспектом полиморфизма является возможность использовать объект дочернего класса,
где ожидается объект его родительского класса.
Один из способов сделать это явно - создать экземпляр объекта дочернего класса в
качестве члена родительского класса.
Теперь вопрос
ЗАчем
Noodle biangBiang = new Spaghetti();
если мы можем написать и результат получим один и тот же
Spaghetti biangBiang = new Spaghetti();
Пример всего кода
class Noodle {
protected double lengthInCentimeters;
protected double widthInCentimeters;
protected String shape;
protected String ingredients;
protected String texture = "brittle";
Noodle(double lenInCent, double wthInCent, String shp, String ingr) {
this.lengthInCentimeters = lenInCent;
this.widthInCentimeters = wthInCent;
this.shape = shp;
this.ingredients = ingr;
}
public String getCookPrep() {
return "Boil noodle for 7 minutes and add sauce.";
}
public static void main(String[] args) {
Noodle n = new Noodle(30.0, 0.2, "round", "semolina flour");
System.out.println(n.getCookPrep());
Spaghetti a = new Spaghetti();
System.out.println(a.getCookPrep());
}
}
class Spaghetti extends Noodle {
Spaghetti() {
super(30.0, 0.2, "round", "semolina flour");
}
public String getCookPrep() {
return "Boil spaghetti for 8 - 12 minutes and add sauce, cheese, or oil and garlic.";
}
}
Объясните принцип полиморфизма, я его как бы понял, но видимо не со всем раз спрашиваю
данный вопрос, и желательно пример,и хорошую статью и задание на тему полиморфизм. Спасибо.
Ответы
Ответ 1
Например, для этого public static void main(String[] args) { Noodle n = new Noodle(30.0, 0.2, "round", "semolina flour"); Spaghetti a = new Spaghetti(); printCookPrep(n); printCookPrep(a); } public static void printCookPrep(Noodle n){ System.out.println(n.getCookPrep()); }Ответ 2
Например, у вас имеется база данных сотрудников фирмы. В ней есть абстрактный класс "Сотрудник" (который имеет поля имя и зарплата, а также методы доступа к ним), и от него наследуются более конкретные "Менеджер", "Программист", "Уборщик" и т.д., которые имеют свои более специфические состояния и поведения. И вот задача: вывести список всех сотрудников и их зарплату в один файл. Для абстрактных классов можно создавать объектные переменные, но такие переменные должны ссылаться на объект неабстрактного класса. Если заранее собирать в список всех сотрудников, то такая задача решится за один обход коллекции. public abstract class Employee { private String name; private Integer pay; public void setName(String aName) { name = aName; } public String getName() { return name; } public void setPay(int value) { pay = value; } public Integer getPay() { return pay; } } public class Coder extends Employee { private String position; public Coder(String name, int pay, String _position) { setName(name); setPay(pay); setPosition(_position); } public void setPosition(String value) { position = value; } public String getPosition() { return position; } } public class Manager extends Employee { public Manager(String name, int pay) { setName(name); setPay(pay); } } public class TEST { public static void main(String[] args) { LinkedListemployees = new LinkedList (); // Нанимаем менеджера employees.add(new Manager("John", 25000)); // Нанимаем программиста Coder coder1 = new Coder("Nick", 30000, "Junior"); employees.add(coder1); // Нанимаем ещё менеджера Manager manager1 = new Manager("Cameron", 25000); employees.add(manager1); // Выводим список всех сотрудников for (Employee current : employees) { System.out.println(current.getName() + " - " + current.getPay().toString()); } } } Вот пример реализации принципа полиморфизма, к объектам подкласса можно обращаться из ссылочных переменных их суперкласса. НО здесь например нельзя будет из коллекции вызвать метод setPosition для объекта класса Coder, так как класс Employee не имеет о нём понятия. employees.get(1).setPosition("Middle"); //error: cannot find symbol // правильное решение, однако для этого необходимо проверять, является ли данный объект коллекции объектом требуемого класса, например используя instanceof Coder myCoder = employees.get(1); myCoder.setPosition("Middle"); Могу посоветовать книгу Кей Хорстманна "Java Библиотека профессонала" том 1. В главе о "Наследование" об этом рассказывается подробнее и с примерами кода.
Комментариев нет:
Отправить комментарий