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.