Desidero attirare l'attenzione su un'altra soluzione fornita da Required
, a parte che Matt ha dato sopra.
class superClass{
var name: String
required init(){
// initializer implementation goes here
self.name = "Untitled"
}
}
class subClass: superClass {
var neakName: String = "Subclass Untitled"
}
let instanceSubClass = subClass()
instanceSubClass.name //output: "Untitled"
instanceSubClass.neakName //output: "Subclass Untitled"
come si può verificare nel precedente esempio, ho dichiarato required init()
su superClass
, init()
inizializzazione di superClass ha ereditato di default su subClass
, Così in grado di creare un'istanza di sottoclasse let instanceSubClass = subClass()
.
Tuttavia, si supponga di voler aggiungere un inizializzatore designato nella sottoclasse per assegnare il valore del tempo di esecuzione alla proprietà memorizzata neakName
. Ovviamente è possibile aggiungerlo, ma ciò comporterà nessun inizializzatore dalla superClass sarà ereditato nella sottoclassella, Quindi se si crea un'istanza di subClass
si creerà tramite il proprio inizializzatore designato come di seguito.
class superClass{
var name: String
init(){
// initializer implementation goes here
self.name = "Untitled"
}
}
class subClass: superClass {
var neakName: String = "Subclass Untitled"
init(neakName: String) {
self.neakName = neakName
}
}
let instanceSubClass = subClass(neakName: "Bobby")
instanceSubClass.name //output: "Untitled"
instanceSubClass.neakName //output: "Bobby"
Qui sopra, non sarà in grado di creare un'istanza di subClass
semplicemente subClass()
, Ma se si vuole che ogni sottoclassi di superClass devono avere la propria init()
initializer per creare un'istanza diretta da subClass()
. È sufficiente inserire la parola chiave required
prima di init()
in superClass, che ti costringerà ad aggiungere l'inizializzatore init()
allo subClass
, come indicato di seguito.
class superClass{
var name: String
required init(){
// initializer implementation goes here
self.name = "Untitled"
}
}
class subClass: superClass {
var neakName: String = "Subclass Untitled"
init(neakName: String) {
self.neakName = neakName
}
} // Compiler error <------------ required `init()` must be provided by subClass.
let instanceSubClass = subClass(neakName: "Bobby")
instanceSubClass.name //output: "Untitled"
instanceSubClass.neakName //output: "Bobby"
SO, utilizzare required
parola chiave prima di inizializzazione sulla superclasse, quando si desidera che tutti devono sottoclassi sono state attuate required initializer
della superclasse.
L'implementazione nelle sottoclassi non è necessaria a causa dell'ereditarietà, il che ha senso. Tuttavia, sto anche chiedendo il beneficio qui. Se una sottoclasse (che sostituisce ipoteticamente 'init()' ma non un inizializzatore richiesto) ottiene init da un processo che ha chiamato l'inizializzatore richiesto ereditato, e che l'inizializzatore richiesto successivamente chiama 'init()', non chiamerebbe la sottoclasse ' init sovrascritto e tutto è buono? - Io penserei che l'unica buona ragione sarebbe che l'inizializzatore richiesto ** non ** chiama 'init()' su se stesso, quindi l'override 'init()' non verrebbe mai chiamato. –
Questo potrebbe essere interessante in questo contesto: [Protocol func che restituisce Self] (http://stackoverflow.com/questions/25645090/protocol-func-returning-self). –