Перейти к содержанию

🗒 Задача

Необходимо разработать простую систему мониторинга погодных условий, которая будет собирать данные о температуре и количестве осадков.

Создай абстрактный класс WeatherStationStats. Он будет служить родителем для классов-объектов погодных данных: Temperature и PrecipitationAmount.

Реализуй логику имитации отправки сообщения на сервер в классе WeatherServer. Метод отправки сообщения должен принимать объект типа WeatherStationStats и, в зависимости от типа переданного объекта, выводить соответствующие данные.

Создай по одному объекту для разных типов погодных данных и протестируй работу программы.

❌ Ошибки

  • дочерние классы не имеют полей со значениями для инициализации

✏️ Комментарии

Хорошо, но предлагаю для большей безопасности учесть вариант, что могут прийти данные, не относящиеся к этим двум классам.
Лучше эту функцию сделать тоже абстрактной, так как у нее нет базовой реализации
Этот метод не стоит тут делать абстрактным, потому, что реализация будет единая для всех
Текст сообщения следует использовать из свойства класса, чтобы его непосредственно печатать
В этом классе следует добавить метод, например, sendMessage().
Метод должен принимать объекты температуры или осадков. И внутри уже распределять какой именно сообщение отправляется. Но какой тип указать в качестве входного параметра в функцию?
Сложение строк выглядит лишним. Более идиоматично использовать интерполяцию вместо конкатенации.
Это довольно популярный паттерн, когда на входе у метода базовый тип данных, а внутри в зависимости от конкретного типа, разное поведение. Этот паттерн еще называют "Команда": [https://refactoring.guru/ru/design-patterns/command](https://refactoring.guru/ru/design-patterns/command)

🧾 Решение

abstract class WeatherStationStats

class Temperature(val value: Double) : WeatherStationStats()
class PrecipitationAmount(val value: Double) : WeatherStationStats()

class WeatherServer {
    fun sendMessage(weatherData: WeatherStationStats) {
        when (weatherData) {
            is Temperature -> {
                println("Отправка данных о температуре: ${weatherData.value}°C на сервер")
            }
            is PrecipitationAmount -> {
                println("Отправка данных о количестве осадков: ${weatherData.value} мм на сервер")
            }
            else -> {
                println("Неизвестный тип данных")
            }
        }
    }
}

fun main() {
    val temperatureData = Temperature(20.5)
    val precipitationData = PrecipitationAmount(15.2)

    val weatherServer = WeatherServer()

    weatherServer.sendMessage(temperatureData)  
    weatherServer.sendMessage(precipitationData)
}