доступ к функции подкласса из суперкласса - PullRequest
0 голосов
/ 04 мая 2018

Есть ли способ доступа к методам подкласса из суперкласса? Оператор switch находится в функции суперкласса. Функции createCityOne (), createCityTwo (), createCityThree () и т. Д. Каждая имеет свои собственные подклассы.

    if transitionSprite.name == nil || transitionSprite.name == "rd-d2c" || transitionSprite.name == "rd-f2c" || transitionSprite.name == "rd-c2c" {
        print("city should come next")
        switch randomIndex {
        case 0:
            cityOne.createCityOne()
            print("1")
        case 1:
            cityTwo.createCityTwo()
            print("2")
        case 2:
            print("3")
            cityThree.createCityThree()
        default:
            break
        } 

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы не можете напрямую обращаться к методам подкласса из суперкласса, потому что суперкласс ничего не знает о своих собственных подклассах.

Несмотря на то, что вы всегда можете попробовать преобразовать вещи в Swift, чтобы получить функциональность какого-то другого класса.

Взгляните на этот пример. Это очень простой и простой, но я надеюсь, что вы поняли идею.

Итак, представьте, что у вас есть класс Город:

class City {
    func build() {
        print("city is building")
}

И это подкласс Город:

class Town: City {
    func buildTown() {
        print("town is building")
    }
}

Теперь вы хотите получить доступ к функции buildTown() Тауна из класса City. Поскольку Town всегда будет City, так как это подкласс, вы можете создать что-то вроде этого:

class City {
    func build() {
        print("city is building")
    }

    func buildAnything() {
        if self is Town {
            (self as! Town).buildTown()
        }
    }
}

Теперь я не говорю, что вы действительно хотели бы создать что-то подобное, потому что таким способом вы предоставляете логику подкласса суперклассу. Поэтому хорошим способом решения этой проблемы было бы создание только одной функции build() и ее переопределение.

class City {
    func build() {
        print("city is building")
    }
}

class Town: City {
    override func build() {
        print("town is building")
    }
}

В результате вы можете получить доступ к той же функции из любого подкласса City и настроить ее поведение.

let myTown = Town()
let myCity = City()
myCity.build() //prints "city is building"
myTown.build() //prints "town is building"

Хорошее решение всегда зависит от ваших точных целей, поэтому всегда обращайте внимание на множество вариантов, предлагаемых языком. Подробнее о наследовании здесь .

0 голосов
/ 04 мая 2018

Суперкласс вообще не должен знать никаких подклассов. И, конечно, он не должен знать о функциях, специфичных для подклассов.

Что вы должны сделать, это объявить функцию createCity в суперклассе. Затем каждый подкласс должен переопределить эту функцию, чтобы делать то, что подкласс должен делать.

Тогда ваш код прост:

if transitionSprite.name == nil || transitionSprite.name == "rd-d2c" || transitionSprite.name == "rd-f2c" || transitionSprite.name == "rd-c2c" {
    print("city should come next")
    switch randomIndex {
    case 0:
        cityOne.createCity()
        print("1")
    case 1:
        cityTwo.createCity()
        print("2")
    case 2:
        print("3")
        cityThree.createCity()
    default:
        break
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...