1 回答

TA貢獻1788條經驗 獲得超4個贊
我得出的結論是泛型讓這種模式變得更糟。通過參數化Collection結構,您強制items []T擁有相同的元素。使用普通接口,您可以進行動態分派,從而允許items包含不同的實現。僅此一項就應該是充分的理由。
這是一個沒有泛型的最小實現,改編自一些 Java 示例(可運行代碼):
主要接口:
type Visitor func(Element)
type Element interface {
Accept(Visitor)
}
實施者:
type Foo struct{}
func (f Foo) Accept(visitor Visitor) {
visitor(f)
}
容器:
type List struct {
elements []Element
}
func (l *List) Accept(visitor Visitor) {
for _, e := range l.elements {
e.Accept(visitor)
}
visitor(l)
}
訪客本身,作為常規功能。在這里您可以自由定義任何功能。由于是無類型的,您可以直接將其作為Visitor參數傳遞:
func doVisitor(v Element) {
switch v.(type) {
case *List:
fmt.Println("visiting list")
case Foo:
fmt.Println("visiting foo")
case Bar:
fmt.Println("visiting bar")
}
}
- 1 回答
- 0 關注
- 131 瀏覽
添加回答
舉報