Абстракция:
Как говорилось в начале статьи нельзя игнорировать абстракцию, а значит и абстрактные классы и методы.
В контексте ООП абстракция - это обобщение данных и поведения для типа, находящегося выше текущего класса по иерархии.
Перемещая переменные или методы из подкласса в супер класс, вы обобщаете их. Это общие понятия, и они применимы в языке Java. Но язык добавляет также понятия абстрактных классов и абстрактных методов.
Абстрактный класс является классом, для которого нельзя создать экземпляр.
Например, вы можете создать класс Animal(животное). Нет смысла создавать экземпляр этого класса: на практике вам нужно будет создавать экземпляры конкретных классов, например, Dog (собака). Но все классы Animal имеют некоторые общие вещи, например, способность издавать звуки. То, чтоAnimal может издавать звуки, еще ни о чем не говорит.
Издаваемый звук зависит от вида животного.
Как это смоделировать?
Определить общее поведение в абстрактном классе и заставить подклассы реализовывать конкретное поведение, зависящее от их типа.
В иерархии могут одновременно находиться как абстрактные, так и конкретные классы.
Использование абстракции:
Наш класс Person содержит некоторый метод поведения, и мы пока не знаем, что он нам необходим. Удалим его и заставим подклассы реализовывать это поведение полиморфным способом. Мы можем сделать это, определив методы Person как абстрактные. Тогда наши подклассы должны будут реализовывать эти методы.
?
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public abstract class Person { abstract void move(); abstract void talk(); }
public class Adult extends Person { public Adult() { } public void move() { System.out.println("Walked."); } public void talk() { System.out.println("Spoke."); } }
public class Baby extends Person { public Baby() { } public void move() { System.out.println("Crawled."); } public void talk() { System.out.println("Gurgled."); } } |
Что мы сделали в приведенном выше коде?
Мы изменили Person и указали методы как abstract, заставив подклассы реализовывать их. Мы сделали Adult подклассом Person и реализовали эти методы. Мы сделали Baby подклассом Person и реализовали эти методы.
Объявляя метод абстрактным, вы требуете от подклассов либо реализации этого метода, либо указания метода в этих подклассах абстрактным и передачи ответственности по реализации метода к следующим подклассам. Можно реализовать некоторые методы в абстрактном классе и заставить подклассы реализовывать остальные. Это зависит от вас. Просто объявите методы, которые не хотите реализовывать, как абстрактные и не предоставляйте тело метода. Если подкласс не реализует абстрактный метод супер класса, компилятор выдаст ошибку.
Теперь, поскольку Adult и Baby являются подклассами Person, мы можем обратиться к экземпляру каждого класса как к типу Person.
