web-dev-qa-db-fra.com

Quel est le mot clé 'open' dans Swift?

Le fichier ObjectiveC.Swift de la bibliothèque standard contient les quelques lignes de code suivantes autour de la ligne 228:

extension NSObject : Equatable, Hashable {
  /// ...
  open var hashValue: Int {
    return hash
  }
}

Que signifie open var dans ce contexte ou quel est le mot clé open en général?

282
Clashsoft

Lire ouvert comme 

ouvert pour héritage dans d'autres modules

Je répète ouvert pour héritage dans d'autres modules. Une classe ouverte est donc ouverte pour le sous-classement dans d'autres modules incluant le module de définition. Les vars ouverts et les fonctions sont ouverts pour la substitution dans d'autres modules. C'est le niveau d'accès le moins restrictif. C'est aussi bon que l'accès public accepte que quelque chose de public soit fermé pour héritage dans d'autres modules. 

De Apple Docs :

L'accès ouvert s'applique uniquement aux classes et aux membres de la classe. Il diffère de l'accès public comme suit:

  1. Les classes avec accès public, ou tout niveau d'accès plus restrictif, peuvent être sous-classé uniquement dans le module où ils sont définis. 

  2. Les membres de classe ayant un accès public, ou tout niveau d’accès plus restrictif, peuvent être remplacés par des sous-classes uniquement dans le module où ils se trouvent défini.

  3. Les classes ouvertes peuvent être sous-classées dans le module où elles sont définies et dans n’importe quel module qui importe le module où ils sont définis. 

  4. Les membres de classe ouverts peuvent être remplacés par des sous-classes dans le module où ils sont définis, et dans n’importe quel module qui importe le module où ils sont définis.
7
Mohammad Sadiq

Open est un niveau d'accès. Il a été introduit pour imposer des limites à l'héritage de classe sur Swift. 

Cela signifie que le niveau d'accès open ne peut être appliqué qu'à classes et aux membres de la classe.

En cours

Une classe ouverte peut être sous-classée dans le module dans lequel elle est définie et dans les modules qui importent le module dans lequel la classe est définie.

Membres de la classe

La même chose s'applique aux membres du groupe. Une méthode ouverte peut être remplacée par des sous-classes dans le module dans lequel elle est définie et dans les modules qui importent le module dans lequel la méthode est définie.

LA NECESSITE DE CETTE MISE A JOUR

Certaines classes de bibliothèques et de structures ne sont pas conçues pour être sous-classées, ce qui peut entraîner un comportement inattendu. La bibliothèque Apple native ne permettra pas non plus de surcharger les mêmes méthodes et classes, 

Ainsi, après cet ajout, ils appliqueront les niveaux d’accès public et privé en conséquence.

Pour plus de détails, consultez Documentation Apple sur le contrôle d'accès

4
Saranjith

open est uniquement destiné à un autre module, par exemple: cabosses de cacao, ou test unitaire, on peut hériter ou remplacer 

0
William

open venez jouer quand vous avez plusieurs modules.

la classe ouverte est accessible et sous-classable en dehors du module de définition. Un membre de classe ouvert est accessible et peut être remplacé en dehors du module de définition.

0
Rajasekaran Gopal

À l'exception de la sous-classe, un open class func est également accessible depuis n'importe où dans votre projet. Imaginons que vous définissiez une fonction de classe ouverte dans votre classe Util, comme ceci

open class Utils: NSObject {
    open class func printHello() {
        print("Hello from utils")
    }
}

Puis, n’importe où dans vos contrôleurs de vue, vous pouvez simplement accéder à cette méthode en appelant

Utils.printHello()
0
Fangming