私は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 –