Мой класс Enum и сопутствующий объект:
enum class Temperature(val names: List<String>) {
Celsius(listOf("degree Celsius", "degrees Celsius", "celsius", "dc", "c")),
Kelvin(listOf("Kelvin", "Kelvins", "k")),
Fahrenheit(listOf("degree Fahrenheit", "degrees Fahrenheit", "fahrenheit", "df", "f"));
companion object Conversion {
fun CelsiusToKelvin(c: Double) = c + 273.15
fun CelsiusToFahrenheit(c: Double) = (c * 9 / 5) + 32
fun FahrenheitToKelvin(f: Double) = (f + 459.67) * 5 / 9
fun FahrenheitToCelsius(f: Double) = (f - 32) * 5 / 9
fun KelvinToCelsius(K: Double) = K - 273.15
fun KelvinToFahrenheit(K: Double) = K * 9 / 5 - 459.67
}
}
Я получаю входную температуру в шкале, которую мне нужно преобразовать в другой выходной масштаб. Есть ли способ динамического вызова функций объекта-компаньона на основе масштабов ввода и вывода?
Например:
var convert = "CelsiusToKelvin"
val value = 36.9
val myFunc = Temperature.getFunction(convert)
val myOutput = myFunc(value)
Это должно вызвать функцию Temperature.CelsiusToKelvin
.
Я знаю, что могу проверить ввод с помощью операторов if
или when
и вручную вызвать нужную функцию. Но возможно ли это без этого?
Редактировать 1:
Я решил это, используя изменение функции:
companion object Conversion {
fun convert(a:String,b:String,c:Double) = when {
a == "Celsius" && b == "Kelvin" -> c + 273.15
a == "Celsius" && b == "Fahrenheit" -> (c * 9 / 5) + 32
a == "Fahrenheit" && b == "Kelvin" -> (c + 459.67) * 5 / 9
a == "Fahrenheit" && b == "Celsius" -> (c - 32) * 5 / 9
a == "Kelvin" && b == "Celsius" -> c - 273.15
a == "Kelvin" && b == "Fahrenheit" -> c * 9 / 5 - 459.67
else -> 0.0
}
}
Но я хочу знать если бы то, что я изначально хотел сделать, было возможно