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

时间:2015-03-30 19:53:30

标签: ios swift

在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]
               ]
    }

}

1 个答案:

答案 0 :(得分:2)

如果你将子类化并覆盖initGrid,它将调用当前范围内的方法。 在基类中,您可以将其保持为空,作为抽象。 即:

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

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