在Swift中,如何在基类的init
方法中调用子类的函数?本质上,目标是确保每个子类调用自己的initGrid
版本,然后在基类中只设置一次设置numRows
和numCols
的代码。
但是,在初始化子类时,将运行基类中的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]
]
}
}
答案 0 :(得分:2)
如果你将子类化并覆盖initGrid,它将调用当前范围内的方法。 在基类中,您可以将其保持为空,作为抽象。 即:
class AdvancedGrid: BaseGrid {
override init() {
super.init()
}
override func initGrid() {
// here is you custom alghoritm
}
}