Porto una discreta quantità di codice da una piattaforma che supporta classi base astratte su Swift e corro molto. Se quello che vuoi veramente è la funzionalità di una classe base astratta, allora ciò significa che questa classe serve sia come implementazione della funzionalità di classe basata condivisa (altrimenti sarebbe solo un'interfaccia / protocollo) E definisce i metodi che devono essere implementati da classi derivate.
Per farlo in Swift, avrai bisogno di un protocollo e di una classe base.
protocol Thing
{
func sharedFunction()
func abstractFunction()
}
class BaseThing
{
func sharedFunction()
{
println("All classes share this implementation")
}
}
Si noti che la classe base implementa i metodi condivisi, ma non implementa il protocollo (poiché non implementa tutti i metodi).
Quindi nella classe derivata:
class DerivedThing : BaseThing, Thing
{
func abstractFunction()
{
println("Derived classes implement this");
}
}
La classe derivata eredita sharedFunction dalla classe base, aiutandola a soddisfare quella parte del protocollo e il protocollo richiede ancora la classe derivata per implementare abstractFunction.
L'unico vero svantaggio di questo metodo è che, poiché la classe base non implementa il protocollo, se si dispone di un metodo della classe base che richiede l'accesso a una proprietà / metodo del protocollo, è necessario sovrascriverlo nella classe derivata e da lì chiamare la classe base (tramite super) passa in self
modo che la classe base abbia un'istanza del protocollo con cui svolgere il proprio lavoro.
Ad esempio, supponiamo che sharedFunction debba chiamare abstractFunction. Il protocollo rimarrebbe lo stesso e le classi ora sembrerebbero:
class BaseThing
{
func sharedFunction(thing: Thing)
{
println("All classes share this implementation")
thing.abstractFunction()
}
}
class DerivedThing : BaseThing, Thing
{
func sharedFunction()
{
super.sharedFunction(self)
}
func abstractFunction()
{
println("Derived classes implement this");
}
}
Ora sharedFunction dalla classe derivata sta soddisfacendo quella parte del protocollo, ma la classe derivata è ancora in grado di condividere la logica della classe base in modo ragionevolmente semplice.