覆盖功能不起作用

时间:2017-02-09 13:50:52

标签: swift override

我从一本书中学得很快,并输入了一个结构和类的例子。然而,该示例并不像它应该的那样工作,因为无论何时调用僵尸,程序都不会减少人口。我知道这是一个愚蠢的问题,但我无法理解为什么。有人能解释一下是什么错吗?所以这里是代码:

main.swift

import Foundation

var myTown = Town()
myTown.changePopulation(by:500)

let fredTheZombie = Zombie()
fredTheZombie.town = myTown
fredTheZombie.terrorizeTown()
fredTheZombie.town?.printDescription()
myTown.printDescription()

Town.swift

import Foundation

struct Town {
var population = 5422
var numberOfStopLights = 4

func printDescription() {
    print("Population: \(myTown.population), number of stoplights: \ .    (myTown.numberOfStopLights).")
}
 mutating func changePopulation(by amount: Int){
    population += amount
}
}

Monster.swift

import Foundation

class Monster{
var town: Town?
var name = "Monster"

func terrorizeTown(){
    if town != nil{
        print("\(name) is terrorazing a town!")
    }
    else{
        print("\(name) hasn't found a town to terrorize yet...")
    }
}
}

Zombie.swift

import Foundation

class Zombie: Monster {

override func terrorizeTown() { 
town?.changePopulation(by: -10)
super.terrorizeTown() 
}
}

2 个答案:

答案 0 :(得分:1)

由于Town是一个结构体,因此在将其指定给僵尸时会复制它。因此,fredTheZombie.terrorizeTown()会恐吓myTown的副本 - 所以myTown会保留其价值。

你想要的是一个课程,当你将它分配给你的怪物时,它会被参考转移 - 所以你只有一个城镇:

class Town {
    var population = 5422
    var numberOfStopLights = 4

    func printDescription() {
        print("Population: \(myTown.population), number of stoplights: \ .    (myTown.numberOfStopLights).")
    }
    func changePopulation(by amount: Int){
        population += amount
    }
}

答案 1 :(得分:1)

如果您将Town从结构改为类,它将起作用。

每次分配时都会复制一个结构,所以当你把zombie.town = myTown放在同一个城镇时,僵尸会有一个城镇的副本,当僵尸的城镇更新时,原来的城镇不会改变。课程将以您期望的方式运作。