Реализация нескольких интерфейсов
Часть раздела Объектно-ориентированное программирование путешествия по 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;
}
}Класс должен реализовать все методы каждого интерфейса, который он объявляет. Вы также можете комбинировать наследование с несколькими интерфейсами:
public class Square extends Shape implements Drawable, Resizable {
// Должен реализовать методы из обоих интерфейсов
// Также может использовать унаследованные члены из Shape
}Эта гибкость позволяет проектировать классы, выполняющие несколько ролей. SmartPhone может реализовывать интерфейсы Callable, Messageable и Browsable, каждый из которых определяет различные возможности, поддерживаемые телефоном.
Задание
ЛегкоДавайте создадим систему умных устройств, где устройства могут обладать несколькими возможностями. Вы создадите SmartTV, который можно как включать/выключать, так и управлять его громкостью — это продемонстрирует, как один класс может реализовывать несколько интерфейсов для выполнения различных ролей.
Вы организуете свой код в четырех файлах:
Powerable.java: Определите интерфейс для устройств, которые можно включать. Он должен объявлять два метода:powerOn()иpowerOff(), оба возвращают void.VolumeControl.java: Определите интерфейс для устройств с регулировкой громкости. Он должен объявлять методsetVolume(int level), который возвращает void, и методgetVolume(), который возвращает int.SmartTV.java: Создайте класс, который реализует оба интерфейсаPowerableиVolumeControl. Ваш SmartTV должен иметь полеbrand(String), полеisOn(boolean, изначально false) и полеvolume(int, изначально 0). Включите конструктор, который принимает название бренда. Реализуйте все необходимые методы: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: Соберите все вместе, чтобы продемонстрировать реализацию нескольких интерфейсов. Вы получите два входных значения: название бренда (String) и уровень громкости (int). Создайте SmartTV с указанным брендом, затем:- Вызовите
powerOn() - Вызовите
setVolume()с заданным уровнем - Выведите:
Current volume: [volume], используяgetVolume() - Вызовите
powerOff()
- Вызовите
Вы получите два входных значения: бренд телевизора (String) и уровень громкости (int).
Ваш вывод должен содержать четыре строки, демонстрирующие, как ваш SmartTV выполняет контракты обоих интерфейсов — его можно включать, как любое устройство Powerable, и управлять его громкостью, как любым устройством VolumeControl!
Шпаргалка
Класс может реализовывать несколько интерфейсов, перечисляя их через запятую после ключевого слова implements:
public class Rectangle implements Drawable, Resizable {
// Должен реализовать все методы из обоих интерфейсов
}Класс должен реализовать все методы каждого интерфейса, который он объявляет.
Вы также можете комбинировать наследование классов с реализацией нескольких интерфейсов:
public class Square extends Shape implements Drawable, Resizable {
// Реализует методы из обоих интерфейсов
// Может использовать унаследованные члены из Shape
}Это позволяет классу выполнять несколько ролей и обладать различными возможностями.
Попробуйте сами
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: Вывести: Current volume: [volume], используя 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
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»