Помимо разработки библиотек, есть еще один кейс, где эсплицитный
public несет дополнительную смысловую нагрузку
abstract class Animal {
protected abstract fun say(): String
}
abstract class Fox : Animal() {
public override fun say(): String {
return "Ring-ding-ding-ding-dingeringeding!"
}
}
class ArcticFox : Fox() {
// тут public уже не нужен
override fun say(): String {
return "Wa-pa-pa-pa-pa-pa-pow!"
}
}
class FennecFox : Fox() {
// тут тоже
override fun say(): String {
return "Chacha-chacha-chacha-chow!"
}
}
С точки зрения синтаксиса котлин такое позволяет, и тулинг не подсвечивает его как redundant
А еще в котлине есть ключевое слово
finalКонцептуально это очень похоже на предыдущий кейс, ибо и
public, и final здесь выполняют одну и ту же функцию – нивелируют предыдущую эксплицитную декларацию: public можно использовать для того, чтобы перекрыть protected / internal, а final – для open / abstract
open class RedFox : Fox() {
final override fun say(): String {
return "A-hee-ahee ha-hee!"
}
}
class EuropeanRedFox : RedFox() {
// ошибка – “’say' in 'RedFox' is final and cannot be overridden”
override fun say(): String {
return "A-oo-oo-oo-ooo! Woo-oo-oo-ooo!"
}
}
@loops_everlasting