Реализация нескольких интерфейсов
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy. Урок 36 из 87.
В отличие от наследования классов, при котором можно расширить только один класс, Java позволяет классу реализовать несколько интерфейсов. Так Java безопасно реализует одну из форм множественного наследования.
Чтобы реализовать несколько интерфейсов, перечислите их после ключевого слова implements, разделив их запятыми:
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int width, int height);
}
public class Rectangle implements Drawable, Resizable {
private int width, height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
@Override
public void draw() {
System.out.println("Drawing rectangle " + width + "x" + height);
}
@Override
public void resize(int width, int height) {
this.width = width;
this.height = height;
}
}class должен implement all methods из каждого interface, который он объявляет. Также можно сочетать наследование с несколькими interfaces:
public class Square extends Shape implements Drawable, Resizable {
// Необходимо реализовать методы из обоих интерфейсов
// Также можно использовать унаследованные члены из Shape
}Эта гибкость позволяет проектировать классы, выполняющие несколько ролей. SmartPhone может реализовывать интерфейсы Callable, Messageable и Browsable, каждый из которых определяет различные возможности, поддерживаемые телефоном.
Задание
ЛегкоДавайте создадим систему умных устройств, в которой устройства могут обладать несколькими возможностями. Вы создадите SmartTV, который можно включать и выключать, а также управлять его громкостью: это продемонстрирует, как один класс может реализовывать несколько interface, чтобы выполнять разные роли.
Вы распределите код по четырём файлам:
Powerable.java: Define interface для устройств, которые можно включать. Он должен объявлять два метода:powerOn()иpowerOff(), оба возвращающие void.VolumeControl.java: Define interface для устройств с управлением громкостью. Он должен объявлять методsetVolume(int level), возвращающий void, и методgetVolume(), возвращающий int.SmartTV.java: Create класс, который implements оба interface —PowerableиVolumeControl. Ваш SmartTV должен иметь полеbrand(String), полеisOn(boolean, initially false) и полеvolume(int, initially 0). Добавьте constructor, принимающий название бренда. Реализуйте все требуемые методы:powerOn()должен устанавливатьisOnв значение true и выводить:[brand] TV is now ONpowerOff()должен устанавливатьisOnв значение false и выводить:[brand] TV is now OFFsetVolume(int level)должен обновлять громкость и выводить:[brand] TV volume set to [level]getVolume()должен возвращать текущую громкость
Main.java: Объедините всё, чтобы продемонстрировать реализацию нескольких interface. Вы получите два входных значения: название бренда (String) и уровень громкости (int). Create SmartTV с указанным брендом, затем:- Вызовите
powerOn() - Вызовите
setVolume()с указанным уровнем - Выведите:
Current volume: [volume], используяgetVolume() - Вызовите
powerOff()
- Вызовите
Вы получите два входных значения: бренд телевизора (String) и уровень громкости (int).
В результате должны быть показаны четыре строки, демонстрирующие, как ваш SmartTV выполняет оба контракта interface. Его можно включать и выключать как любое устройство Powerable, а его громкостью можно управлять как у любого устройства VolumeControl!
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Прочитать входные данные
String brand = scanner.nextLine();
int volumeLevel = scanner.nextInt();
// TODO: Создать SmartTV с заданным брендом
// TODO: Вызвать powerOn()
// TODO: Вызвать setVolume() с заданным уровнем
// TODO: Print: Current volume: [volume] using getVolume()
// TODO: Вызвать powerOff()
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»Потренируйтесь самостоятельно: Онлайн-компилятор Java