Je suis nouveau sur Kotlin et je suis confus entre open
et public
mots-clés. Quelqu'un pourrait-il me dire la différence entre ces mots clés?
Réponses
Trop de publicités?L' open
mot clé est "ouvert pour l'extension":
L'
open
annotation sur une classe est à l'opposé de Javafinal
: cela permet aux autres d'hériter de cette classe. Par défaut, toutes les classes de Kotlin sontfinal
, ce qui correspond à l' Effectif de Java, Point 17: Conception et document de l'héritage ou de l'autre de l'interdire.
Vous avez également besoin d'être explicite sur les méthodes que vous souhaitez faire substituables, également marqué par open
:
open class Base {
open fun v() {}
fun nv() {}
}
L' public
mot agit comme un modificateur de visibilité qui peut être appliqué sur des classes, des fonctions, etc.
Notez que public
est la valeur par défaut si rien d'autre n'est spécifié de manière explicite:
Si vous ne spécifiez pas de modificateur de visibilité,
public
est utilisé par défaut, ce qui signifie que vos déclarations seront visibles partout
class A { ... }
en Java est égale à open class A { ... }
dans Kotlin.final class B { ... }
en Java est égale à class B { ...}
dans Kotlin.
Il n'est pas lié avec public
.
Dans Kotlin, le tout sans modificateurs d'accès est - public
par défaut. Vous pouvez préciser explicitement public
dans la définition, mais il n'est pas nécessaire de Kotlin.
Donc,
public class A { ... }
et
class A { ... }
sont les mêmes dans Kotlin.
Je mets ici juste pour mon mémo, peut-être utile pour quelqu'un d'autre :
ouvrir la classe de kotlin signifie qu'une classe peut être héréditaire, car par défaut ils ne sont pas:
class Car{....}
class Supercar:Car{....} : // give an error
open Car2{....}
class Supercar:Car2{....} : // ok
public classe en Java, à propos de la visibilité de la classe (rien à voir avec l'héritage : à moins d'une classe en java est définitive, elle peut être hérité par défaut). Dans kotlin l'ensemble de la classe sont publics par défaut.
ouvrir méthode de kotlin signifie que la méthode peut être redéfinie, car par défaut ils ne sont pas. Au lieu de cela en Java, toutes les méthodes peuvent être remplacées par défaut
La méthode d'une classe ne peut pas être remplacée par défaut comme d'habitude (n'a pas d'importance si la classe est ouverte), ils doivent être déclarés qu'ils puissent être remplacés :
open class Car{
fun steering{...}
}
class Supercar:Car{
override fun steering {...} // give an error
}
open class Car2{
open fun steering{...}
}
class Supercar:Car2{
override fun steering {...} // ok
}
pour plus de détails : https://kotlinlang.org/docs/reference/classes.html
open est opposé à Final en java. Si la classe n'est pas «ouverte», elle ne peut pas être héritée.
class First{}
class Second:First(){} // Not allowed. Since 'First' is Final(as in Java) by default. Unless marked "open" it can't be inherited
Ne vous confondez pas avec ouvert et public. public est un modificateur de visibilité
class Third{} // By default this is public
private class Fourth{}
class Fifth{
val third = Third() // No issues
val fourth = Fourth() // Can't access because Fourth is private
}