72 votes

Quelle est la différence entre «ouvert» et «public» à Kotlin?

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?

97voto

s1m0nw1 Points 21698

L' open mot clé est "ouvert pour l'extension":

L' open annotation sur une classe est à l'opposé de Java final: cela permet aux autres d'hériter de cette classe. Par défaut, toutes les classes de Kotlin sont final, 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

27voto

Naetmul Points 6394

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.

15voto

android_dev71 Points 1

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

4voto

nag prakash Points 145

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
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X