fun StarWarsMovie.releaseYear(): Int {
val year = release_date.substring(0, 4)
return year.toInt()
}
val newHope = StarWarsMovie("A New Hope", 4, "1977-05-25")
val releaseYear = newHope.releaseYear()
println("The release year of A New Hope is $releaseYear")
No exemplo acima, definimos um novo método na classe, chamado releaseYear(). Observe que o definimos diretamente na classe existente: StarWarsMovie.releaseYear(). Podemos fazer isso com nossas próprias classes, mas também com classes importadas de bibliotecas de terceiros. A documentação do Kotlin mostra um exemplo de adição de um método à biblioteca padrão. (Estou um pouco cauteloso com esse tipo de patch de macaco, mas certamente mostra a flexibilidade do Kotlin.)
Agora, imagine que queríamos StarWarsMovie ser uma subclasse de uma Movie superclasse. Em Kotlin, poderíamos fazer algo assim:
open class Movie(val title: String, val releaseDate: String) {
open fun releaseYear(): Int {
val year = releaseDate.substring(0, 4) return year.toInt()
}
}
class StarWarsMovie(title: String, episodeId: Int, releaseDate: String) : Movie(title, releaseDate) {
val episodeId: Int = episodeId
}
O open palavra-chave indica que uma classe ou função está disponível para subclassificação ou substituição. Em termos Java, as classes Kotlin são finais por padrão. Membros públicos padrão e classes finais padrão poderiam ser interpretados como um incentivo sutil para preferir a composição à herança. No exemplo anterior, usamos declaração baseada em construtor para ambos StarWarsMovie e Movie. O cólon em : movie indica extensão, funcionando de forma semelhante ao Java extends palavra-chave.
