2015-03-30 3 views
1

В Swift, как вы можете вызвать функцию подкласса в методе базового класса init? По существу, целью является обеспечение того, чтобы каждый подкласс вызывал свою собственную версию initGrid, а затем весь код для установки numRows и numCols определен только один раз в базовом классе.Swift: вызов функции подкласса в версии базового класса init

Однако при инициализации подкласса вместо этого выполняется функция 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

Это печатает «Подкласс» для меня: https://gist.github.com/jawwad/1ee4347debd082a3c768 – Jawwad

+0

Спасибо @Jawwad, но это не работает для нас. Теперь вопрос содержит код для подкласса. – Crashalot

ответ

1

Если вы будете подклассифицировать и переопределить initGrid, он вызовет метод в текущей области. В базовом классе вы можете оставить его пустым, как абстрактное. т.е .:

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

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

Хм, это не работает по какой-то причине. Обновлен вопрос с кодом подкласса. Любые подсказки? – Crashalot

+0

подробно описал его, потому что сетка пуста. Постройте его в функции переопределения. – dimpiax

+0

Извините, что вы имеете в виду? Да, код компилируется, если это вопрос. – Crashalot

Смежные вопросы