Wprowadzam wzór gościa w Swift 2.2 dla projektu w pracy.W jaki sposób mogę zredukować plan podstawowy w systemie Swift?
Aby nie musieć sprowadzać kodu źródłowego i zaoszczędzić mi trochę czasu, użyję numeru 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" }
}
Problem I zostały próby rozwiązania jest zmniejszenie Gotowa na każdej klasy pochodnej Planet
. Jak widać, wszystkie mają tę samą funkcję, co duplikaty func accept(visitor: PlanetVisitor) { visitor.visit(self) }
.
Próbowałem wprowadzić domyślną implementację protokołu Planet
i wdrożyć go na klasie bazowej, a Swift wydaje się, że nie pozwala na to z powodu kompilacji czasu przeciążenia.
Przykłady:
Domyślna implementacja na protokole: Klasa
extension Planet {
func accept(visitor: PlanetVisitor) { visitor.visit(self) }
}
Podstawa:
class PlanetBase: Planet {
func accept(visitor: PlanetVisitor) { visitor.visit(self) }
}
class PlanetAlderaan: PlanetBase {}
class PlanetCoruscant: PlanetBase {}
class PlanetTatooine: PlanetBase {}
Czy ktoś zna sposób, że funkcja accept
mogą być wykonane rodzajowy i stosowane automatycznie każda konkretna klasa wywodząca się z Planet
? To nie jest kwestia krytyczna, ale jest świetną zagadką!
Masz rację! Z jakiegoś powodu myślałem, że inne języki, takie jak C++, mogą zaimplementować metodę akceptacji w klasie bazowej, ale okazuje się, że się myliłem. Zobacz: https://stackoverflow.com/questions/17190873/c-visitor-pattern-why-should-every-derived-visited-implement-accept –