这是一种通过组合(而不是继承)的多态性形式
假设有一个包装类型,包装AbstractT
的具体子类型的一些实例,其中包装器本身是AbstractT
的子类型(Not nesc始终为true,但一般而言)。
要添加所有方法,一个类似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
一般来说,你不会委托所有的方法,因为你会想要做些不同的事情,毕竟创建新类型的点。