Pourquoi utiliser des Initialiseurs de Swift dans les classes?
Je suis en train d'essayer de comprendre l'utilisation de la required
mot-clé dans Swift classes.
class SomeClass
{
required init() {
//initializer implementation goes here
}
}
required
ne pas me forcer à mettre en œuvre la méthode dans mes enfant de la classe. Si je veux remplacer le required
désigné de l'initialiseur de ma classe parent j'ai besoin d'écrire required
et pas override
. Je sais comment il fonctionne, mais ne peut pas comprendre pourquoi je devrais le faire.
Quel est l'avantage de required
?
Aussi loin que je peux dire, langages tels que le C# ne pas avoir quelque chose comme ça et fonctionnent très bien avec override
.
- Mise en œuvre dans votre sous-classes n'est pas nécessaire en raison de l'héritage, ce qui est logique. Cependant, je suis également se demander l'intérêt ici. Si une sous-classe (qui, par hypothèse, les remplacements de
init()
mais pas des initialiseur) obtient init par un processus appelé la héritées nécessaire d'initialiseur, et il est nécessaire d'initialiseur par la suite des appelsinit()
, ne serait-il pas appel à la sous-classe' substituée init et tout est bon? -- Je pense que la seule bonne raison serait que l'initialiseur de ne pas appelinit()
sur soi, donc primordiale 'init()' ne sera jamais appelé. - Cela pourrait être intéressant dans ce contexte: Protocole func retour Auto.
Vous devez vous connecter pour publier un commentaire.
Fait juste un moyen de satisfaire le compilateur pour s'assurer qu'il que si cette classe de sous-classes, ils n'héritent ou de mettre en œuvre cette même initialiseur. Il y a un doute sur ce point, en raison de la règle qui si une sous-classe a désigné un initialiseur de son propre, pas de initialiseurs de la classe mère sont hérités. Il est donc possible pour une super-classe d'avoir un initialiseur et de la sous-classe pas de l'avoir.
required
surmonte cette possibilité.Une situation où le compilateur a besoin d'être convaincu de cette façon implique protocoles, et fonctionne comme ceci:
Le problème est que si l'Oiseau avait une sous-classe, cette sous-classe pour la mise en œuvre ou d'en hériter
init
, et vous n'avez pas la garantie que. Le marquage de l'Oiseauinit
commerequired
ne pouvons le garantir.Alternativement, vous pouvez marquer des Oiseaux comme
final
, garantissant ainsi, à l'inverse, à savoir qu'il n'aura jamais une sous-classe.Autre situation où vous avez une méthode de fabrique qui peuvent faire une classe ou de sa sous-classe en appelant le même initialiseur:
dogMakerAndNamer
est l'appel de lainit(name:)
initialiseur sur Chien ou un Chien à la sous-classe. Mais comment le compilateur assurez-vous qu'une sous-classe d'avoir uninit(name:)
initialiseur? Lerequired
désignation calme le compilateur craintes.required
est quand ils sont forcés par le compilateur. Le compilateur ding vous et vous allez utiliser l'une des solutions décrites ci-dessus. Sinon, ne l'utilisez pas.Je tiens à attirer l'attention sur une autre solution fournie par
Required
, à l'exception de Matt a donné ci-dessus.Que vous pouvez vérifier dans l'exemple ci-dessus, j'ai déclaré
required init()
sursuperClass
,init()
initialiseur de la super-classe est héritée par défaut sursubClass
, de Sorte que vous en mesure de créer une instance de la sous-classelet instanceSubClass = subClass()
.Mais, supposons que vous vouliez ajouter un initialiseur sur sous-classe d'attribuer moment de l'exécution de la valeur pour l'entreposage des biens
neakName
. Bien sûr, vous pouvez l'ajouter, mais qui en résultera à pas les initialiseurs de la super-classe est transmise à la sous-classe, Donc si vous allez créer une instance desubClass
vous permettra de créer, à travers sa propre initialiseur comme ci-dessous.Ci-dessus, vous ne serez pas en mesure de créer une instance de
subClass
par justesubClass()
, Mais si vous voulez que tous les sous-classes de la classe mère doit avoir son propreinit()
initialiseur à la création directe d'une instance parsubClass()
. Il suffit de placerrequired
mot-clé avant deinit()
sur la super-classe, il va vous forcer à ajouterinit()
initialiseur sursubClass
trop comme ci-dessous.AINSI, l'utilisation de
required
mot-clé avant de l'initialiseur sur la super-classe, quand vous voulez, toutes les sous-classes doivent avoir été mises en œuvrerequired initializer
de la super-classe.Selon la la documentation:
Donc oui, requis ne force tous les enfants des classes pour mettre en œuvre ce constructeur. Cependant, ce n'est pas nécessaire
Donc, si vous avez créé plus complexe classes qui ne peuvent pas être entièrement initialisé avec un constructeur parent, vous devez mettre en œuvre l'exigent constructeur.
Exemple à partir de la documentation (avec quelques trucs):
Si vous essayez d'ajouter votre propre initialiser dans la sous-classe, alors, vous devez suivre certaines choses, ceux qui ont été déclarées dans la classe super. Donc assurez-vous que vous n'oublierez pas de mettre en œuvre cette méthode. Si vous oubliez le compilateur va vous donner l'erreur
//fatal error, we've not included the required init()
. Une autre raison est qu'il crée un ensemble de conditions qui jamais sous-classe doit suivre la sous-classe est la définition de ses propres initialiser.