Вызов подпрограмм в подклассах - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть определенный пользователем класс Map с одним экземпляром map.Карта содержит двумерный массив пользовательских объектов, называемых квадратами, типа Grid.Класс Grid содержит переменную с именем contains, которая содержит один объект из множества возможных пользовательских классов.Из модуля Grid я пытаюсь вызвать функцию в определенном пользователем классе с именем Bug.

Каков правильный синтаксис для этого?

//within Class Grid

func GenerateImage() -> Int{

        if self.containType == 1{
            return self.contains.DisplayBug()
        }else if self.containType == 2{
            return 13
        }else{
            return 0
        }
    }

//within class Bug

func DisplayBug() -> Int{
    if self.male == false{
        return self.direction
    }else{
        if self.appearance == 1{
            switch self.direction{
            case 1:
                return 5
            case 2:
                return 6
            case 3:
                return 7
            case 4:
                return 8
            default:
                return 0
            }
        }else if self.appearance == 2{
            switch self.direction{
            case 1:
                return 9
            case 2:
                return 10
            case 3:
                return 11
            case 4:
                return 12
            default:
                return 0
            }
        }else{
            return 0
        }
    }
}

1 Ответ

0 голосов
/ 18 февраля 2019

Я позволил себе создать пример структуры имеющихся у вас классов, поскольку вы не предоставили реализацию этих классов:

class Grid {
    let contains: SomeProtocol

    init(contains: SomeProtocol) {
        self.contains = contains
    }
}

class Map {
    let squares: [[Grid]]

    init(squares: [[Grid]]) {
        self.squares = squares
    }
}

Как видите, containsсвойство имеет тип SomeProtocol, который определяется следующим образом:

protocol SomeProtocol {
    func displayBug()
}

Далее идут классы, реализующие этот протокол (это всего лишь пример, иллюстрирующий, что реализация метода displayBug может различаться):

class Bug: SomeProtocol {
    func displayBug() {
        print("called from Bug")
    }
}
class Foo: SomeProtocol {
    func displayBug() {
        print("called from Foo")
    }
}
class Bar: SomeProtocol {
    func displayBug() {
        print("called from Bar")
    }
}
class Buz: SomeProtocol {
    func displayBug() {
        print("called from Buz")
    }
}

Теперь, когда иерархия установлена, мы можем проверить ее:

let map = Map(squares: [
    [
        Grid(contains: Bug()),
        Grid(contains: Foo())
    ],
    [
        Grid(contains: Bar()),
        Grid(contains: Buz())
    ]
])

for gridArray in map.squares {
    for grid in gridArray {
        grid.contains.displayBug()
    }
}

, вызванный из Bug

, вызванный из Foo

звонили из бара

звонили из Буз

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...