Классы в Kotlin
Зачем нужны классы?
Классы позволяют объединять данные и методы в логические блоки. В Kotlin есть несколько типов классов, каждый решает свои задачи.
Основные типы классов
1. Обычный класс (class
)
Используется для создания объектов с состоянием (полями) и поведением (методами).
Пример: класс Car
class Car(val model: String, val year: Int) {
fun startEngine() {
println("Двигатель $model запущен.")
}
}
// Использование
val myCar = Car("Tesla Model S", 2023)
myCar.startEngine()
В консоли
Двигатель Tesla Model S запущен.
2. Data класс (data class
)
Специальный класс для хранения данных. Автоматически генерирует методы toString()
, equals()
, hashCode()
.
Пример: data class CarData
data class CarData(
val model: String,
val fuelType: FuelType,
val price: Double
)
// Использование
val carInfo = CarData("Toyota Camry", FuelType.PETROL, 30000.0)
println(carInfo) // Автоматический toString()
В консоли
CarData(model=Toyota Camry, fuelType=PETROL, price=30000.0)
3. Enum класс (enum class
)
Определяет набор именованных констант. Полезен для ограниченного списка значений.
Пример: enum class FuelType
enum class FuelType {
PETROL,
DIESEL,
ELECTRIC
}
// Использование в классе Car
class Car(val fuel: FuelType) {
fun fuelInfo() {
println("Тип топлива: $fuel")
}
}
4. Объект (object
)
Синглтон — существует в единственном экземпляре. Используется для утилит или фабрик.
Пример: объект-фабрика CarFactory
object CarFactory {
fun createCar(model: String): Car {
return Car(model, 2023)
}
}
// Использование
val newCar = CarFactory.createCar("BMW X5")
newCar.startEngine()
В консоли
Двигатель BMW X5 запущен.
5. Sealed класс (sealed class
)
Ограничивает иерархию классов. Все наследники должны быть объявлены в том же модуле.
Пример: обработка результатов
sealed class Result {
data class Success(val message: String) : Result()
data class Error(val code: Int) : Result()
}
fun handleResult(result: Result) {
when(result) {
is Result.Success -> println("Успех: ${result.message}")
is Result.Error -> println("Ошибка: код ${result.code}")
}
}
6. Абстрактный класс (abstract class
)
Нельзя создать экземпляр. Используется как база для наследования.
Пример: абстрактный класс Vehicle
abstract class Vehicle {
abstract fun move()
}
class Bicycle : Vehicle() {
override fun move() {
println("Велосипед едет.")
}
}
7. Вложенный класс (inner
/nested class
)
- Nested класс — не имеет доступа к внешнему классу.
- Inner класс — имеет доступ к полям внешнего класса.
Пример: класс Engine внутри Car
class Car(val model: String) {
inner class Engine {
fun start() {
println("Двигатель $model запущен.") // Доступ к model из внешнего класса
}
}
}
// Использование
val car = Car("Audi A4")
val engine = car.Engine()
engine.start()
В консоли
Двигатель Audi A4 запущен.
Пример логики: система управления автосалоном
Полный пример
enum class CarType { SEDAN, SUV, ELECTRIC }
data class Car(
val id: Int,
val type: CarType,
val price: Double
)
object CarInventory {
private val cars = mutableListOf<Car>()
fun addCar(car: Car) {
cars.add(car)
}
fun listCars() {
cars.forEach { println("Машина ${it.id}: ${it.type}, цена ${it.price}") }
}
}
fun main() {
CarInventory.addCar(Car(1, CarType.SEDAN, 25000.0))
CarInventory.addCar(Car(2, CarType.ELECTRIC, 45000.0))
CarInventory.listCars()
}
В консоли
Машина 1: SEDAN, цена 25000.0
Машина 2: ELECTRIC, цена 45000.0