我在 Swift 中实现了一个随机树数据结构。为了约束树的宽度和深度,我决定使用策略(策略)模式。
我的政策如下所示:
protocol BaseTreeNodePolicy {
static var maximumDepth: Int { get }
static var maximumWidth: Int { get }
}
我有一个看起来像这样的基类:
class BaseTreeNode<PolicyType: BaseTreeNodePolicy> { /* ... */ }
它的一些子类:
class ValueNode<ValueType, PolicyType: BaseTreeNodePolicy>: BaseTreeNode<PolicyType> { /* ... */ }
class ActionNode<PolicyType: BaseTreeNodePolicy>: BaseTreeNode<PolicyType> { /* ... */ }
在我添加这个类之前,一切都运行良好:
final class SequenceNode<ChildType: ActionNode<PolicyType>, PolicyType: BaseTreeNodePolicy>: ActionNode<PolicyType> {
public var sequence: [ChildType] = []
// ...
public override func addRandomDescendants(generator: EntropyGenerator, maxDepth: Int) {
// ...
sequence.reserveCapacity(42)
// ...
let descendant = ChildType(generator: generator, maxDepth: maxDepth - 1)
// ...
}
}
编译时SequenceNode
,我在这一行得到编译器错误:
// 'ChildType' is not a subtype of 'ActionNode<PolicyType>'
sequence.reserveCapacity(42)
而这一行:
// Type 'PolicyType' does not conform to protocol 'BaseTreeNodePolicy'
let descendant = ChildType(generator: generator, maxDepth: maxDepth - 1)
我不知道出了什么问题,因为我在声明的标题部分清楚地说明了类型ChildType: ActionNode<PolicyType>
要求PolicyType: BaseTreeNodePolicy
。
有什么问题?
提前致谢!彼得。