Наследование
Создайте интерфейс Figure, который означает геометрическую фигуру. По ходу решения постоянно
пишите код, который проверяет работоспособность всех реализованных функций.
- Добавьте методы
double area()иdouble perimiter(), которые возвращают, соответственно, площадь и периметр фигуры. Добавьте методString info()для указания краткой информации о фигуре. Там будет возвращаться текст типа “квадрат со стороной 7”, “круг радиуса 22” и т.п. - Добавьте классы
- круг
- квадрат
- прямоугольник
- ромб
- равносторонний треугольник
- прямоугольный треугольник
Они должны реализовывать интерфейс
Figureи переопределять все необходимые методы. В конструкторы классов должны передаваться размеры: ширина и высота для прямоугольника, сторона для квадрата, радиус для круга, сторона для равностороннего треугольника, две стороны прямоугольного треугольника, длины диагоналей у ромба.Для проверки создайте массив
Figure[], заполните его всеми видами фигур и в цикле распечатайте информацию о каждой фигуре, ее площадь и периметр. - В прошлой задаче все классы напрямую наследовали
Figure. Теперь унаследуйте прямоугольник от квадрата или квадрат от прямоугольника. Подумайте, как будет лучше. - Добавьте абстрактный класс Параллелограм. От него должны наследоваться прямоугольник, квадрат и ромб. Параллелограмм должен хранить длины двух своих сторон и уметь вычислять периметр. А вот вычисление площади должно быть абстрактным. Соответственно, уберите вычисление периметра из классов наследников.
- Мы хотим иметь возможность вычислять ёмкость фигуры, это отношение ее площади к квадрату
периметра. Но мы не хотим программировать одно и то же для каждой фигуры.
Есть такие варианты, реализуйте их:
- Добавьте в интерфейс
Figureстатический методdouble capacity(Figure f). - Добавьте в интерфейс
Figureметод по умолчаниюdefault double capacity(). Разберитесь самостоятельно, что это за методы по умолчанию. Переопределите вычисление ёмкости в одной из фигур, чтобы вычисление стало более эффективным.
В цикле, где печатается информация о фигурах, дополнительно распечатайте ёмкость каждым из реализованных способов.
Кстати, у какой фигуры максимальная ёмкость?
- Добавьте в интерфейс
- (*) можно сделать дополнительно класс Треугольник, от него наследуются прямоугольный и равносторонний треугольники. Он сможет вычислять и свою площадь, и свой периметр по трем сторонам.
- (**) Вообще-то квадрат тоже ромб. Но пока это никак не отражено в наследовании. Если хочется сделать
квадрат и ромбом, и прямоугольником, два последних класса должны стать интерфейсами. Т.е. все должно стать
интерфейсами. Сделайте все интерфейсами, в интерфейсах вместо полей сделайте методы с именами типа
getR(), например, чтобы получить радиус круга. Реализуйте каждый интерфейс классом с именем типаRectangleImpl,SquareImpl. Понадобавляйте в интерфейсы необходимое количество default методов. Для создания фигур в интерфейсы нужно добавить статические методыcreate(), например, вCircleбудет методstatic Circle create(), который возвращаетCircleImpl.
Интерфейсы, лямбда выражения и анонимные классы
- Создайте интерфейс
Printableс одним методомvoid print(), этот метод означает, что объект печатает что-то на экране. Сделайте так, что классDrawingиз прошлого семестра реализует этот интерфейс. Проверьте, что получилось. -
Создайте класс PrintableLetter, реализующий интерфейс Printable. Пользоваться классом нужно так:
PrintableLetter pl = new PrintableLetter("x", 10); pl.print(); //печатает букву x 10 раз -
Создайте класс
PrintableString, реализующий интерфейсPrintable, этот класс хранит строку, пользоваться им нужно так:PrintableString ps = new PrintableString("asdf"); ps.print(); //печатает asdf - Создайте массив типа Printable[], заполните его 1)
Drawing2)PrintableLetter3)PrintableString4) анонимным классом 5) лямбда выражением. В цикле попросите всех что-нибудь напечатать.