方法不会覆盖其超类中的任何方法(Swift 4,Xcode 9)

时间:2017-10-03 18:55:44

标签: swift

我检查了几个与同一问题相关的主题,但我在自己的代码中找不到任何解决方案...

当我尝试覆盖我的Piano:Instrument子类中的函数tune()时发生错误。

我复制/超过了超类原始函数,以确保语法完全相同。

另外,在我看来,子类做得很好,因为super.init方法似乎按预期工作(没有编译器错误)。

拜托,有人可以指出我的错误在哪里?

代码:

class Music {

    let notes: [String]

    init(notes: [String]) {
        self.notes = notes
    }

    func prepared() -> String {
        return notes.joined(separator: " ")
    }

}

class Instrument {

    let model: String

    init(model: String) {
        self.model = model

        func tune() -> String {
            fatalError("Implement this method for \(model)")
        }

        func play(_ music: Music) -> String {
            return music.prepared()
        }

        func perform(_ music: Music) {
            print(tune())
            print(play(music))
        }

    }

}

class Piano: Instrument {

    let hasPedals: Bool

    init(hasPedals: Bool, model: String) {
        self.hasPedals = hasPedals
        super.init(model: model)

    }

    override func tune() -> String {
        fatalError("Implement this method for \(model)")
    }

}

class Guitar: Instrument {

    let hasAmplifyer: Bool

    init(hasAmplifyer: Bool, model: String) {
        self.hasAmplifyer = hasAmplifyer
        super.init(model: model)

    }

}

非常感谢!

1 个答案:

答案 0 :(得分:0)

您在tune函数内意外定义了playperforminit函数。将它们移到顶层:

class Instrument {

    let model: String

    init(model: String) {
        self.model = model
    }

    func tune() -> String {
        fatalError("Implement this method for \(model)")
    }

    func play(_ music: Music) -> String {
        return music.prepared()
    }

    func perform(_ music: Music) {
        print(tune())
        print(play(music))
    }

}

Swift看不到要覆盖的tune函数,因为它希望它位于Instrument的顶层。