Вы не можете напрямую обращаться к методам подкласса из суперкласса, потому что суперкласс ничего не знает о своих собственных подклассах.
Несмотря на то, что вы всегда можете попробовать преобразовать вещи в 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"
Хорошее решение всегда зависит от ваших точных целей, поэтому всегда обращайте внимание на множество вариантов, предлагаемых языком. Подробнее о наследовании здесь .