我正在工作中实现Swift 2.2中的访问者模式。为了不必简化源代码并节省时间,我将使用Oktawian Chojnacki在Swift中访问者模式的示例。
我一直在努力解决的问题是减少每个派生自
我尝试在
示例:
协议上的默认实现:
基类:
protocol PlanetVisitor {
func visit(planet: PlanetAlderaan)
func visit(planet: PlanetCoruscant)
func visit(planet: PlanetTatooine)
}
protocol Planet {
func accept(visitor: PlanetVisitor)
}
class PlanetAlderaan: Planet {
func accept(visitor: PlanetVisitor) { visitor.visit(self) }
}
class PlanetCoruscant: Planet {
func accept(visitor: PlanetVisitor) { visitor.visit(self) }
}
class PlanetTatooine: Planet {
func accept(visitor: PlanetVisitor) { visitor.visit(self) }
}
class NameVisitor: PlanetVisitor {
var name = ""
func visit(planet: PlanetAlderaan) { name = "Alderaan" }
func visit(planet: PlanetCoruscant) { name = "Coruscant" }
func visit(planet: PlanetTatooine) { name = "Tatooine" }
}
我一直在努力解决的问题是减少每个派生自
Planet
的类上的样板代码。
正如您所看到的,它们都有相同的重复函数func accept(visitor: PlanetVisitor) { visitor.visit(self) }
。我尝试在
Planet
协议上放置默认实现并在基类上实现它,但Swift似乎不允许由于编译时重载解析。示例:
协议上的默认实现:
extension Planet {
func accept(visitor: PlanetVisitor) { visitor.visit(self) }
}
基类:
class PlanetBase: Planet {
func accept(visitor: PlanetVisitor) { visitor.visit(self) }
}
class PlanetAlderaan: PlanetBase {}
class PlanetCoruscant: PlanetBase {}
class PlanetTatooine: PlanetBase {}
有没有办法使accept
函数变成通用的,并自动应用于从Planet
派生出的每个具体类?这不是一个关键问题,但它是一个很大的难题!