Extension Function
Kotlin et permet estendre una classe amb noves funcions sense tenir que modificar la classe o crear una classe nova que estengui la classe a la cual vols afegir una nova funcionalitat.
Introducció
Kotlin et permet “afegir” funcions a una classe sense haver de modificar la classe o crear una classe nova que extend la classe a la qual vols afegir una nova funcionalitat.
D’aquesta manera podem adaptar classes que no pertanyen al nostre codi a les necessitats específiques del nostre projecte sense haver de modificar la classe corresponent, i el que és més important, de tal manera que aquestes funcions es puguin executar com si fossin part de l’API de la classe.
Això és molt important perquè et permet crear una classe sense tenir-la que omplir de funcions que potser mai es faran servir.
Flexibilitat
És molt habitual troba una classe Circle com la que es mostra a continuació:
class Circle(val radius: Double) {
fun area(): Double {
return Math.PI * radius * radius
}
}Qui va dissenyar la classe va pensar que era important l’àrea d’un cercle, però res més.
Si pel teu projecte és important el perimetre d’un cercle tu has d’escriure una funció que computi el perimetre:
class Circle(val radius: Double) {
fun area(): Double {
return Math.PI * radius * radius
}
}
fun Circle_perimeter(circle: Circle): Double {
return 2 * Math.PI * circle.radius
}
fun main() {
val circle = new Circle(2.5)
println("Area is ${circle.area()}")
println("Perimeter is ${Circle_perimeter(circle)}")
}Pots veure que la funció Circle_perimeter només funciona amb objectes de la classe Circle, però no és un mètode de la classe Circle.
Kotlin et permet crear una funció com una extensió d’una classe per tal que sintàcticament no hi hagi diferència.
Per tant, afegeix la funció perimeter() a la classe Circle com una funció d’extensió tal com es mostra a continuació:
class Circle(val radius: Double) {
fun area(): Double {
return Math.PI * radius * radius
}
}
fun Circle.perimeter(): Double {
return 2 * Math.PI * radius
}
fun main() {
val circle = new Circle(2.5)
println("Area is ${circle.area()}")
println("Perimeter is ${circle.perimeter()}")
}D’aquesta manera pots invocar la funció perimeter() com si l’hagués declarat la classe Circle.
El que hem fet és:
-
Afegir el prefix
Circle.al nom de la funció. -
Eliminar l’argument
circlede la funció ja que les propietats públiques de la classeCirclees poden accedir amb una sintaxi igual que si la funció fos un mètode de la classe.
A més que el resultat és més fàcil de llegir, les IDEs poden oferir la funció mitjançant la funció d’autocompletar com si fos un mètode estàndar de la classe Circle.
Accessibilitat
Encara que Kotlin ens permet escriure una funció d’extensió com si fos un mètode de la classe en veritat no és un mètode, sinó una funció externa que només pot accedir a les propietats de la classe que es poden accedir desde fora de la classe.
Aquest codi no es compila directament:
val circle = new Circle(3)
circle.perimeter()Estàs llegint una vista prèvia.
Inicia sessió per llegir l'article complet. Qualsevol compte obre 4 articles gratuïts al mes; l'alumnat i el professorat llegeixen les pàgines del seu curs sense límit.
Inicia sessió