Перейти к основному содержимому
Версия: Legacy

Классы в 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