我将相当多的代码从支持抽象基类的平台移植到 Swift 并经常运行。如果您真正想要的是抽象基类的功能,那么这意味着该类既可用作基于共享的类功能的实现(否则它将只是一个接口/协议),并且它定义了必须由以下人员实现的方法派生类。
要在 Swift 中做到这一点,您需要一个协议和一个基类。
protocol Thing
{
func sharedFunction()
func abstractFunction()
}
class BaseThing
{
func sharedFunction()
{
println("All classes share this implementation")
}
}
请注意,基类实现了共享方法,但没有实现协议(因为它没有实现所有方法)。
然后在派生类中:
class DerivedThing : BaseThing, Thing
{
func abstractFunction()
{
println("Derived classes implement this");
}
}
派生类从基类继承sharedFunction,帮助它满足协议的那部分,协议仍然要求派生类实现abstractFunction。
这个方法唯一真正的缺点是,由于基类没有实现协议,如果你有一个需要访问协议属性/方法的基类方法,你将不得不在派生类中覆盖它,并且从那里调用传递self 的基类(通过super),以便基类有一个协议的实例来完成它的工作。
例如,假设 sharedFunction 需要调用 abstractFunction。协议将保持不变,类现在看起来像:
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");
}
}
现在派生类的 sharedFunction 满足了协议的那一部分,但派生类仍然能够以相当直接的方式共享基类逻辑。