Интерфейс позволяет определить контракт, который должен быть реализован классами. Классы могут реализовывать несколько интерфейсов.
Интерфейсы объявляются с помощью ключевого слова interface
.
Они могут содержать абстрактные методы и свойства, а также методы с реализацией по умолчанию.
interface MyInterface {
// Абстрактный метод
fun abstractMethod()
// Метод с реализацией по умолчанию
fun defaultMethod() {
println("This is a default method")
}
}
Класс реализует интерфейс с помощью ключевого слова implements
. Класс должен предоставить реализацию всех абстрактных методов, определенных в интерфейсе.
class MyClass : MyInterface {
// Реализация абстрактного метода, унаследованного от интерфейса
override fun abstractMethod() {
println("This is an implementation of abstractMethod")
}
}
fun main() {
val obj = MyClass()
obj.abstractMethod() // Вывод: This is an implementation of abstractMethod
obj.defaultMethod() // Вывод: This is a default method
}
Интерфейсы могут содержать абстрактные свойства, которые должны быть реализованы в классе. Также можно определить свойства с геттерами и сеттерами по умолчанию.
interface MyInterface {
// Абстрактное свойство
val abstractProperty: String
// Свойство с реализацией геттера по умолчанию
val defaultProperty: String
get() = "Default Property"
}
class MyClass : MyInterface {
// Реализация абстрактного свойства
override val abstractProperty: String = "Implemented Property"
}
fun main() {
val obj = MyClass()
println(obj.abstractProperty) // Вывод: Implemented Property
println(obj.defaultProperty) // Вывод: Default Property
}
Класс может реализовывать несколько интерфейсов.
interface InterfaceA {
fun methodA()
}
interface InterfaceB {
fun methodB()
}
class MyClass : InterfaceA, InterfaceB {
override fun methodA() {
println("Method A")
}
override fun methodB() {
println("Method B")
}
}
fun main() {
val obj = MyClass()
obj.methodA() // Вывод: Method A
obj.methodB() // Вывод: Method B
}
Интерфейс может наследовать один или несколько других интерфейсов.
interface BaseInterface {
fun baseMethod()
}
interface DerivedInterface : BaseInterface {
fun derivedMethod()
}
class MyClass : DerivedInterface {
override fun baseMethod() {
println("Implementation of baseMethod")
}
override fun derivedMethod() {
println("Implementation of derivedMethod")
}
}
fun main() {
val obj = MyClass()
obj.baseMethod() // Вывод: Implementation of baseMethod
obj.derivedMethod() // Вывод: Implementation of derivedMethod
}
...
...
...
Объект создается с помощью ключевого слова object
. Этот объект может быть использован как экземпляр класса (синглтона), но при этом не требует явного создания экземпляра.
object MySingleton {
val name = "Singleton Object"
fun sayHello() {
println("Hello from $name")
}
}
fun main() {
MySingleton.sayHello() // Вывод: Hello from Singleton Object
}
Анонимный объект может быть использован как выражение, чтобы создать экземпляр класса без явного создания класса.
fun main() {
val myObject = object {
val name = "Anonymous Object"
fun sayHello() {
println("Hello from $name")
}
}
myObject.sayHello() // Вывод: Hello from Anonymous Object
}
Анонимный объект реализует интерфейс или наследует класс, но не требует создания отдельного класса для этого.
interface MyInterface {
fun doSomething()
}
fun main() {
val myObject = object : MyInterface {
override fun doSomething() {
println("Doing something")
}
}
myObject.doSomething() // Вывод: Doing something
}
Объект может быть передан в качестве параметра функции.
fun processObject(obj: Any) {
println("Processing object: $obj")
}
fun main() {
processObject(object {
val value = 42
})
}
Анонимные объекты могут использоваться в качестве возвращаемых типов значений.
interface SystemInfo {
val systemName: String
val version: String
fun printInfo()
}
fun getSystemInfo(): SystemInfo {
return object : SystemInfo {
override val systemName: String = "MySystem"
override val version: String = "1.0.0"
override fun printInfo() {
println("System Name: $systemName, Version: $version")
}
}
}
fun main() {
val systemInfo = getSystemInfo()
systemInfo.printInfo() // Вывод: System Name: MySystem, Version: 1.0.0
}
Объект-компаньон объявляется внутри класса и позволяет добавить статические члены в класс. Он создается с помощью пары ключевых слов companion object
.
class MyClass {
companion object {
val staticField = "Static Field"
fun staticMethod() {
println("This is a static method")
}
}
}
fun main() {
println(MyClass.staticField) // Вывод: Static Field
MyClass.staticMethod() // Вывод: This is a static method
}
Объект-компаньон может иметь имя, что позволяет обращаться к его членам через это имя.
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
fun main() {
val instance = MyClass.Factory.create()
}
Часть I
- Создание объекта-синглтона. Создайте объект-синглтон
Logger
, который будет хранить информацию о сообщениях, записанных в журнал. Объект должен иметь методlog(message: String)
, который будет сохранять переданное сообщение, методgetLastMessage(): String
, который будет возвращать последнее сохраненное сообщение и методgetAllMessages(): List<String>
, который будет возвращать все сохраненные сообщения. - Использование анонимного объекта для реализации интерфейса. Создайте интерфейс
ClickListener
с методомonClick()
. В основной функции программы создайте анонимный объект, реализующий этот интерфейс, и назначьте его обработчиком события нажатия кнопки. При нажатии кнопки должно выводиться сообщение "Кнопка нажата!". - Создание объекта-компаньона. Создайте класс
User
с приватным конструктором и объектом-компаньоном. Объект-компаньон должен содержать содержать фабричный методcreateUser(name: String, age: Int): User
, который будет создавать и возвращать новый экземпляр классаUser
. - Создание объекта с помощью объектного выражения и переопределение метода. Создайте абстрактный класс
Shape
с абстрактным методомdraw(Graphics2D g)
. В основной функции программы создайте объект классаShape
с помощью объектного выражения и переопределите методdraw(Graphics2D g)
так, чтобы он выводил на графический контекст круг. Используйте графический контекст изображения типаBufferedImage
. Сохраните изображение в файл формата PNG. - Использование анонимного объекта для реализации обратного вызова. Создайте интерфейс
Callback
с методомonResult(result: String)
. Создайте функциюgetData(callback: Callback)
, которая вызывает методonResult()
с некоторым строковым значением. В основной функции программы создайте анонимный объект, реализующий интерфейсCallback
, и передайте его в функциюgetData()
. Реализуйте методonResult()
так, чтобы он выводил на экран переданное ему значение. - Использование анонимного объекта в качестве возвращаемого значения. Создайте интерфейс
Shape
с абстрактным методомdraw(g: Graphics2D)
. Создайте функциюcreateShape(type: String): Shape
, которая принимает строкуtype
и возвращает анонимный объект, представляющий собой соответствующую фигуру. В зависимости от значенияtype
, функция должна возвращать объект, который содержит методdraw(g: Graphics2D)
, выводящий на экран заданную фигуру. Возможные значенияtype
: "circle"
--- возвращает объект, представляющий круг."square"
--- возвращает объект, представляющий квадрат."triangle"
--- возвращает объект, представляющий треугольник.
В основной функции программы вызовите функциюcreateShape
с разными значениямиtype
и вызовите методdraw(g: Graphics2D)
для каждого возвращенного объекта. Выведите фигуры на графический контекст изображения типаBufferedImage
. Сохраните изображение в файл формата PNG.
Часть II Разработка информационной системы управления онлайн-курсами. Разработать информационную систему управления онлайн-курсами на основе принципов объектно-ориентированного программирования (ООП) с использованием наследования и реализации интерфейсов. Система должна обеспечивать хранение создаваемых объектов (курсов, студентов, преподавателей и пр.) в коллекциях и предоставлять функциональность для управления ими.
Требования:
- Создайте интерфейс
Course
со следующими методами:fun getTitle(): String
- возвращает название курса.fun getInstructor(): String
- возвращает имя преподавателя курса.fun getDuration(): Int
- возвращает продолжительность курса в часах.fun getDescription(): String
- возвращает описание курса.
- Создайте абстрактный класс
BaseCourse
, реализующий интерфейсCourse
.- Добавьте свойства:
title: String
(название курса);instructor: String
(имя преподавателя курса);duration: Int
(продолжительность курса в часах);courseId: String
(уникальный идентификатор курса);limit
(лимит количества студентов, которые могут быть записаны на курс). - Реализуйте методы
getTitle()
,getInstructor()
иgetDuration()
иgetLimit()
. - Добавьте абстрактный метод
getCategory(): String
- возвращает категорию курса.
- Добавьте свойства:
- Создайте класс
ProgrammingCourse
, расширяющий классBaseCourse
.- Добавьте свойство
language: String
- язык программирования, который изучается на курсе. - Реализуйте метод
getCategory()
, возвращающий строку "Программирование". - Реализуйте метод
getDescription()
, возвращающий описание курса с указанием языка программирования.
- Добавьте свойство
- Создайте класс
DesignCourse
, наследующийся отBaseCourse
.- Добавьте свойство
software: String
- программное обеспечение, которое используется на курсе. - Реализуйте метод
getCategory()
, возвращающий строку "Дизайн". - Реализуйте метод
getDescription()
, возвращающий описание курса с указанием используемого программного обеспечения.
- Добавьте свойство
- Создайте интерфейс
CourseUser
со следующими методами:fun getName(): String
- возвращает имя пользователя.fun getRole(): String
- возвращает роль пользователя (студент, преподаватель и т.д.).fun enrollInCourse(course: Course): Boolean
- позволяет пользователю записаться на курс и возвращаетtrue
, если он был успешно записан (будем считать, что он был успешно записан, если лимит студентов на курсе не был превышен), иfalse
в противном случае.fun completeCourse(course: Course)
- позволяет пользователю завершить курс.
- Создайте класс
Student
, реализующий интерфейсCourseUser
.- Добавьте свойство
studentId: String
- уникальный идентификатор студента. - Реализуйте методы
getName()
,getRole()
,enrollInCourse()
иcompleteCourse()
.
- Добавьте свойство
- Создайте класс
Instructor
, реализующий интерфейсCourseUser
.- Добавьте свойство
specialization: String
- специализация преподавателя. - Реализуйте методы
getName()
,getRole()
,enrollInCourse()
иcompleteCourse()
.
- Добавьте свойство
- Создайте класс
CourseManagementSystem
, который будет управлять всеми объектами (курсами, студентами, преподавателями и пр.) и предоставлять методы для их добавления, удаления, поиска и других операций. Класс должен содержать следующие методы:fun addCourse(course: Course)
— добавляет курс в систему.fun removeCourse(course: Course)
— удаляет курс из системы.fun getCourses(): List<Course>
— возвращает список всех курсов.fun addStudent(student: Student)
— добавляет студента в систему.fun removeStudent(student: Student)
— удаляет студента из системы.fun getStudents(): List<Student>
— возвращает список всех студентов.fun addInstructor(instructor: Instructor)
— добавляет преподавателя в систему.fun removeInstructor(instructor: Instructor)
— удаляет преподавателя из системы.fun getInstructors(): List<Instructor>
— возвращает список всех преподавателей.fun enrollStudentInCourse(student: Student, course: Course): Boolean
— позволяет студенту записаться на курс.fun completeCourseForStudent(student: Student, course: Course)
— позволяет студенту завершить курс.
Часть III Разработка многослойной иерархии интерфейсов для системы управления университетом. Создайте многослойную иерархию интерфейсов для системы управления университетом. Система должна включать в себя различные модули, такие как управление студентами, управление преподавателями, управление курсами и управление финансами. Каждый модуль должен иметь свои специфические функции, но также должен уметь взаимодействовать с другими модулями через общие интерфейсы.
Требования:
- Интерфейс
Module
:- Базовый интерфейс для всех модулей.
- Содержит метод
getStatus(): String
, который возвращает текущий статус модуля.
- Интерфейс
StudentManagementModule
:- Расширяет интерфейс
Module
. - Содержит методы
enrollStudent(student: Student)
,expelStudent(student: Student)
иgetStudentList(): List<Student>
.
- Расширяет интерфейс
- Интерфейс
TeacherManagementModule
:- Расширяет интерфейс
Module
. - Содержит методы
hireTeacher(teacher: Teacher)
,fireTeacher(teacher: Teacher)
иgetTeacherList(): List<Teacher>
.
- Расширяет интерфейс
- Интерфейс
CourseManagementModule
:- Расширяет интерфейс
Module
. - Содержит методы
createCourse(course: Course)
,deleteCourse(course: Course)
иgetCourseList(): List<Course>
.
- Расширяет интерфейс
- Интерфейс
FinancialManagementModule
:- Расширяет интерфейс
Module
. - Содержит методы
calculateTuitionFee(student: Student): Double
,calculateSalary(teacher: Teacher): Double
иgetTotalBudget(): Double
.
- Расширяет интерфейс
- Классы
Student
,Teacher
,Course
:- Классы, представляющие студентов, преподавателей и курсы соответственно.
- Каждый класс должен иметь свои атрибуты и методы для работы с ними.
- Класс
University
:- Содержит экземпляры всех модулей.
- Предоставляет методы для управления университетом, такие как
admitStudent(student: Student)
,hireTeacher(teacher: Teacher)
,createCourse(course: Course)
,calculateTotalBudget()
.
- Интерфейсы
- Реализация интерфейсов
- Свойства в интерфейсах
- Функциональные интерфейсы
- Наследование интерфейсов
- Объявления объектов
- Объекты-синглтоны
- Объекты-компаньоны
- Анонимные объекты
- Наследование анонимных объектов от супертипов
- Анонимные объекты как параметры функции
- Анонимные объекты как возвращаемые типы значений