Avec l'introduction de la open
dans Swift 3, les éléments suivants sont soudainement des modificateurs de portée valides pour une méthode : open static
, public static
, open class
, public class
mais quelles sont exactement leurs différences ? Je comprends que public
est censé être l'équivalent de public final
en Java permettant open
les méthodes et les variables de la classe à être surchargées, mais alors qu'est-ce que le public class func
o open static func
signifie ? Sont-ils synonymes de public static func
? c'est-à-dire que les trois implémentations ne permettraient pas aux sous-classes de les remplacer ? Y a-t-il des avantages uniques à chacune des 4 permutations différentes dans des contextes spécifiques ?
Réponse
Trop de publicités?Cette question est inutilement compliquée car vous comparez les membres du produit cartésien de deux variables ( open
vs public
y static
vs class
), plutôt que de poser des questions sur les deux variables séparément.
Ce n'est pas une question de open static
vs public static
vs open class
vs public class
mais plutôt de open
vs public
y static
vs class
. Ce sont deux dimensions orthogonales.
open
vs public
public
:
Au sein du module, le public
le spécificateur d'accès permet l'accès y en passant outre.
Depuis l'extérieur du module, le public
Le spécificateur d'accès permet l'accès, mais ne autoriser les surcharges/sous-classes.
open
:
Au sein du module, le open
le spécificateur d'accès permet l'accès y en passant outre.
Depuis l'extérieur du module, le open
Le spécificateur d'accès permet l'accès, y permet les surcharges/sous-classes.
static
vs class
static
:
A static
Un membre (méthode ou propriété) est celui qui est lié à la portée spécifique ( class
/ struct
/ enum
) dans lequel il est défini. On l'appelle ainsi parce que l'accès à ces membres est toujours distribué de manière statique. C'est l'équivalent de la méthode Java static
. Objective C n'a pas d'équivalent à cela.
class
:
A class
Un membre est celui qui est lié à une classe ou à ses sous-classes. class
peuvent être remplacés par des sous-classes. Pour cette raison, ils sont distribués de manière dynamique dans le cas général, bien que les accès à class
peuvent être dévirtualisés par l'optimiseur dans certains cas. Java n'a pas d'équivalent à cela. C'est l'équivalent de la classe d'Objective C ( +
).