答案 0 :(得分:4)
这是通过合成(而不是继承)实现的多态形式
说一个包装类型,包装AbstractT
具体子类型的某些实例
包装器本身应为AbstractT
的子类型
(并非nesc总是正确的,但总的来说。)
要添加所有与AbstractT
这样的子类型完全相同的方法,
我们想委托这些方法中的某些或全部到包装的对象。
我们通过元编程来做到这一点。
如何执行此操作有一些变体。
但是总的来说,提取是很难的模式,因此人们经常自己编写。
说所有AbstractT
子类型都应实现
1arg length
,size
和mean
struct WrappedT{T<:AbstractT} <: AbstractT
backing ::T
...
end
for fun in (:(Base.length), :(Base.size), :(Statistics.mean))
@eval ($fun)(x::WrappedT, args...) = ($fun(x.backing, args...))
end
通常,您不会委派所有方法,因为有些方法您想做不同的事情,那就是最终创建新类型的关键所在。