#java #ооп
Загвоздка такова: по отдельности я более-менее понимаю, о чем эти 2 парадигмы: Абстрактный класс с методами - своего рода шаблон,который наследуют другие классы. Объект такого класса нет смысла создавать, т.к. он абстрактен, но наследники могут использовать его методы и переопределять их. Полиморфизм - это возможность использовать метод с одним именем в разных классах, но по-разному его реализовывать, переопределяя. Также понимаю,что в принципе одну систему можно построить как на базе абстрактного класса,так и используя полиморфизм. Но что использовать лучше и чем они отличаются - я не понимаю, не хватает совсем немного,чтобы додумать. Поясните, пожалуйста, что и как, если можно на примерах. Заранее большое спасибо.
Ответы
Ответ 1
Это тесносвязанные базовые понятия ООП, они дополняют друг друга. Поэтому нельзя говорить "что использовать лучше". Как вы написали, абстрактный класс с методами своего рода шаблон,который наследуют другие классы Так вот, вы задаете определенный шаблон для дальнейшей реализации полиморфизма. Когда от этого абстрактного класса у вас будут 2 или более наследника, реализующие абстрактные методы. Это и будет полиморфизм. Также, часто помогает осознать что это сама расшифровка слова. "поли" - означает много, "морфа" - форма. Полиморфизм - много форм. Есть одна абстракция, и есть много реальных форм этой абстракции. Ещё стоит помнить, что полиморфизм в ООП не ограничивается этим, перегрузка методов - также является полиморфизмом: много форм у одного метода. Ещё раз, не разделяйте понятия ООП и не пытайтесь выбрать "что лучше" - все базовые принципы ООП - костяк, и только используя все кости сразу вы добьетесь красивого результата (конечно, меру знать нужно, так что злоупотреблять не стоит). UPD. касательно вашего комментария: если мы имеем супер-класс,но не абстрактный и наследуем от него другие классы,использующие его метод. можно ведь при этом делать супер-класс не абстрактным. например класс "фигура" и классы-наследники "квадрат", "круг".все будут иметь метод "рисовать". abstract public class Shape { int Color; Coordinates StartPoint; abstract public void Draw(); } class Point extends Shape { public void draw() { // Здесь рисуется точка } } class Circle extends Shape { public void draw() { // Здесь рисуется круг } } class Square extends Shape { public void draw() { // Здесь рисуется квадрат } } Если суперкласс будет неабстрактным в данной ситуации, то либо придется писать реализацию draw() для класса Shape, которую не особо понятно как делать, либо же вообще Shape не будет ничего знать про метод draw() и тогда не получится сделать то, что описано ниже. Зачем все это вообще нужно? Потому что когда-нибудь у вас будет много разных фигур, например, в массиве: Listshapes = shapes(); // Получим откуда-то его. shapes.forEach(Shape::draw); И всё, мы отрисовали все квадраты, круги, точки. И для каждой фигуры вызвался свой метод draw. Это так же ответ на вопрос: а зачем нам выделять из нескольких классов общие черты и плодить еще один дополнительный класс? Ответ 2
Абстрактный класс может не реализовывать некоторые методы, и тогда наследники должны реализовать их. Это тесно связано с полиморфизмом. Абстрактный метод может использоваться в реализации других методов, но конкретная реализация метода будет предоставлена позже. Абстрактный класс и полиморфизм не взаимозаменяемые понятия. Абстрактный класс является одним из инструментов полиморфизма. Например, есть некий компонент: public abstract class Component { public abstract int getPreferredSize(); public int getMinimumSize() { return getPreferredSize(); } public int getMaximumSize() { return getPreferredSize(); } } По умолчанию, минимальный и максимальный размер равняется предпочитаемому. Наследники класса должны обязательно предоставить реализацию метода getPreferredSize() и, по мере необходимости, могут переопределять getMinimumSize() и/или getMaximumSize().Ответ 3
Полиморфизм это не просто переопределение методов. Допустим есть абстрактный класс Animals public abstract class Animals { public void say(){ System.out.println("I'm animals"); } } Есть два наследника Cat и Dog public class Cat extends Animals { @Override public void say() { System.out.println("I'm cat"); } } public class Dog extends Animals { @Override public void say() { System.out.println("I'm dog"); } } Ну и наш класс Main public class Main { public static void main(String[] args) { Listlist = new ArrayList (); list.add(new Cat()); list.add(new Dog()); list.add(new Cat()); list.add(new Dog()); for (Animals an : list) { an.say(); } } } И хоть у нас ссылка типа animals будет вызван метод именно из класса Cat и Dog. I'm cat I'm dog I'm cat I'm dog Ответ 4
Переопределение абстрактных методов абстрактного класса, это относится к полиморфизму. Так же к полиморфизму относится перегрузка функций.
Комментариев нет:
Отправить комментарий