Обычные методы в абстрактном классе Java
Абстрактный класс не обязан состоять только из абстрактных методов. В одном типе удобно держать и обычные методы с реализацией, и объявления без тела, которые потомки должны дописать сами.
Общие поля и методы родителя наследуются как у обычного класса. Абстрактные методы задают, что именно каждый потомок обязан реализовать:
abstract class Content {
private String title = "";
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public void printTitle() {
System.out.println(getTitle());
}
public abstract String render();
}
Метод printTitle уже имеет тело - его не переопределяют
в Post и Page, а просто вызывают. Метод
render в каждом потомке свой:
class Post extends Content {
private String text = "";
@Override
public String render() {
return text;
}
}
class Page extends Content {
@Override
public String render() {
return "static";
}
}
В абстрактном классе допустимы приватные вспомогательные методы - их вызывают только методы того же класса. Публичный метод родителя может пользоваться такой проверкой:
abstract class Content {
private String title = "";
private boolean isNotEmpty(String text) {
return !text.isEmpty();
}
public void setTitle(String title) {
if (isNotEmpty(title)) {
this.title = title;
}
}
public String getTitle() {
return title;
}
public abstract String kind();
}
class Post extends Content {
@Override
public String kind() {
return "post";
}
}
Модификатор protected у метода родителя позволяет вызывать
его из тела потомка, но не из произвольного кода снаружи класса.
Сделайте абстрактный класс Figure
с методом describe, который выводит
на экран площадь и периметр фигуры.
Сделайте методы getArea и
getPerimeter абстрактными.
Реализуйте класс Circle.