Я реализую шаблон посетителя в Swift 2.2 для проекта на работе.Как уменьшить шаблон с шаблоном посетителя в Swift?
Так что мне не нужно сводить мой исходный код и сэкономить некоторое время, я буду использовать example of visitor pattern in swift by Oktawian Chojnacki.
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
? Это не критическая проблема, но это отличная головоломка!
Вы правы! По какой-то причине я думал, что другие языки, такие как C++, могут реализовать метод accept в базовом классе, но оказывается, что я ошибался. См. Https://stackoverflow.com/questions/17190873/c-visitor-pattern-why-should-every-derived-visited-implement-accept –