Tôi đang triển khai mẫu khách truy cập trong Swift 2.2 cho một dự án tại nơi làm việc.Làm thế nào tôi có thể giảm bớt bản mẫu với mẫu khách truy cập trong Swift?
Vì vậy mà tôi không phải đun sôi mã nguồn của mình và để tiết kiệm cho tôi một thời gian, tôi sẽ sử dụng 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" }
}
Vấn đề tôi đang cố gắng giải quyết là giảm bớt bản mẫu trên mỗi lớp có nguồn gốc từ Planet
. Như bạn có thể thấy tất cả chúng đều có cùng chức năng được sao chép func accept(visitor: PlanetVisitor) { visitor.visit(self) }
.
Tôi đã thử cài đặt mặc định trên giao thức Planet
và triển khai nó trên lớp cơ sở và Swift dường như không cho phép điều đó do giải quyết quá tải thời gian biên dịch.
Ví dụ:
Mặc định thực hiện trên giao thức:
extension Planet {
func accept(visitor: PlanetVisitor) { visitor.visit(self) }
}
Base Class:
class PlanetBase: Planet {
func accept(visitor: PlanetVisitor) { visitor.visit(self) }
}
class PlanetAlderaan: PlanetBase {}
class PlanetCoruscant: PlanetBase {}
class PlanetTatooine: PlanetBase {}
Có ai biết một cách rằng accept
chức năng có thể được thực hiện chung chung và áp dụng tự động để mỗi lớp bê tông có nguồn gốc từ Planet
? Nó không phải là một vấn đề quan trọng nhưng nó là một câu đố tuyệt vời!
Bạn nói đúng! Đối với một số lý do tôi nghĩ rằng các ngôn ngữ khác như C + + có thể thực hiện phương pháp chấp nhận trong một lớp cơ sở nhưng nó quay ra tôi đã sai. Xem: https://stackoverflow.com/questions/17190873/c-visitor-pattern-why-should-every-derived-visited-implement-accept –