gpt4 book ai didi

ios - Swift:在init的基类版本中调用子类函数

转载 作者:行者123 更新时间:2023-11-28 05:29:38 32 4
gpt4 key购买 nike

在 Swift 中,如何在基类的 init 方法中调用子类的函数?本质上,目标是确保每个子类调用自己版本的 initGrid,然后仅定义设置 numRowsnumCols 的所有代码一次,在基类中。

但是,在初始化子类时,将运行基类而非子类的 initGrid 函数。这会导致数组索引异常,因为 grid 为空,除非子类创建它。

class BaseGrid {
var grid = [[NodeType]]()
var numRows = 0
var numCols = 0


init() {
// Init grid
initGrid()

// Set <numRows>
numRows = grid.count

// Set <numCols>
numCols = grid[0].count

// Verify each row contains same number of columns
for row in 0..<numRows {
assert(grid[row].count == numCols)
}
}


// Subclasses override this function
func initGrid() {}
}


class ChildGrid: BaseGrid {


override init() {
super.init()
}


override func initGrid() {
grid = [
[NodeType.Blue, NodeType.Blue, NodeType.Blue],
[NodeType.Red, NodeType.Red, NodeType.Red],
[NodeType.Empty, NodeType.Blue, NodeType.Empty]
]
}

}

最佳答案

如果您要子类化并覆盖 initGrid,它将调用当前作用域中的方法。在基类中,您可以将其留空,作为抽象。即:

class AdvancedGrid: BaseGrid {
override init() {
super.init()
}

override func initGrid() {
// here is you custom alghoritm
}
}

关于ios - Swift:在init的基类版本中调用子类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29355051/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com