2015-10-29 5 views
5

In Swift è possibile creare eredità:Come ottenere un riferimento a un genitore/super-classe in Swift?

class A { 

} 

class B:A { 

} 

In questo esempio B eredita da A. Se creo una funzione all'interno di B c'è un modo per ottenere un riferimento alla sua super classe A? Stavo pensando che sarebbe qualcosa di simile:

self.super 

O

self.super() 

O

self.parent 

ho provato tutti questi e nessuno ha lavorato per me. Qualcuno sa come ottenere un riferimento alla super classe?

+1

Cosa intendi per "riferimento alla sua superclasse"? Che cosa stai cercando di fare davvero? Puoi accedere alla _implementazione_ ereditata di un metodo, che di solito tutti possono chiedere. Cosa vuoi di più nella pratica vita reale? – matt

+0

@matt Voglio un riferimento dinamico alla super classe di qualsiasi classe per scoprire quale sia la classe base. Da lì presumo che dovrei essere in grado di istanziarlo o eseguire una sorta di riflessione su di esso. –

+0

Swift non ha introspezione; è deliberato. Puoi chiedere a Cocoa un'introspezione per te, ma ancora una volta, non hai dato un esempio reale di ciò che vuoi fare. Se l'idea è che dovresti fare una cosa se questa è una B e un'altra se questa è una A, il polimorfismo si prende cura di ciò. Ad esempio, è possibile scrivere facilmente una funzione di fabbrica che crea un'istanza A o B a seconda di cosa iniziamo. Di nuovo, e per l'ultima volta, ti chiedo cosa vuoi veramente fare. – matt

risposta

0
class A { 
    func f() { 
     print("A") 
    } 
} 
class B : A { 
    override func f() { 
     print("B") 
     super.f() 
    } 
} 
let b = B() 
b.f() 
1

è necessario importare il runtime Objective-C, e quindi è possibile utilizzare class_getSuperclass().

import ObjectiveC 

class A {} 

class B:A { 
    func mySuper() -> AnyClass { 
     return class_getSuperclass(self.dynamicType) 
    } 
} 

B().mySuper() // A.Type 

È estremamente improbabile che questa sia una buona idea per qualcosa di diverso dal debug e dalla registrazione. Anche in questo caso, è molto diverso da Swift e dovresti ripensare profondamente il tuo problema prima di seguirlo. Anche una sottoclasse di questo tipo è piuttosto spiacevole. I protocolli e le estensioni sono quasi sempre una soluzione migliore dell'ereditarietà in puro Swift (e senza ereditarietà, non è necessario preoccuparsi delle superclassi).

+0

cosa puoi fare con AnyClass ??? – user3441734

+1

Cosa vuoi * * fare con AnyClass? Puoi ispezionarlo, inviarlo messaggi, confrontarlo con altre classi, usarlo per specializzare funzioni generiche, ecc. È un tipo Swift. –

+0

Per favore, mostrami un esempio pratico. – user3441734

0
class A { 
    var type: AnyClass { return A.self } 
} 

class B : A { 
    override var type: AnyClass { return B.self } 
    var superType: AnyClass { return super.type} 
} 

let type = B().type 
let superType = B().superType 
0

classe Dato A: B, sono stato in grado di chiamare solo self.superclass entro B dopo l'importazione ObjectiveC.

Problemi correlati