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 关注
- 90 浏览
添加回答
举报