覆盖具有特殊类型(类)作为参数的函数?

时间:2017-10-04 20:39:26

标签: ios swift

首先,我想提一下,我是一个快速的初学者,这是我有史以来的第一次编程体验。因此,对于你们中的一些人来说,这些问题听起来非常明显......感谢您的理解:)

在使用同名的子类重写函数访问超类函数时,我有些不明白的地方。

这涉及我正在关注的tuto中提到的“特殊类型”:

  

“play(_ :)方法返回一个要播放的字符串。你可能想知道   为什么你会打扰创建一个特殊的音乐类型,而不仅仅是   传递String数组的音符。这提供了几个   优点:创建音乐有助于构建词汇,实现   编译器来检查你的工作,并为将来创造一个地方   扩张“。

https://www.raywenderlich.com/160728/object-oriented-programming-swift

考虑以下代码:

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 play(_ music: Music) -> String {
        return music.prepared()
    }

}

class Piano: Instrument {

    let hasPedals: Bool

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

    }

    override func play(_ music: Music) -> String {
        let preparedNotes = super.play(music)
        return "Piano playing \(preparedNotes)"

    }

}

我的理解是:

  • 1)class Music允许我创建一个音符串。
  • 2)这需要输入(使用初始化程序),这将是一个数组
  • 3)然后使用.joined(separator:“”)将此输入转换为String
  • 4)乐器类有func play(_ music: Music)接受音乐类作为输入。参数名称为music:
  • 5)参数Music可以通过创建Music类的实例来设置(如第2点所述)
  • 6)class Piano: Instrument有一个override func play(_ music: Music)
  • 7)通过添加let preparedNotes = super.play(music),我们正在访问父类func play(_ music: Music)(只是为了它的乐趣,因为在我看来,我们不会添加任何更改吗?)

- 第一个问题:因为似乎可以使用类作为函数的参数,任何人都可以向我展示与此主题相关的任何文档吗?我已经搜索过Apple文档但却找不到任何相关信息......这真让我感到困惑。

- 第二个问题:有人可以向我解释,为什么我们在super.play之后使用(音乐)?当我使用自动完成时,命题是super.play(music: Music),这是非常令人困惑的。这就像我们在这里使用参数名称作为valide参数。这是因为,我们打算首先通过创建音乐实例来设置音乐参数吗? -

- 第三个问题:为什么我们在报价中谈论“特殊类型”?什么是特殊类型?

非常感谢您阅读所有这些内容!

1 个答案:

答案 0 :(得分:0)

首先:您可以在此处找到文档:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html#//apple_ref/doc/uid/TP40014097-CH10-ID158

秒:您将调用musi c的对象传递给超类的play方法。即使您在继承类中override方法M,也可以在超类中访问方法M的原始实现。

第三个问题:为什么类型Music的传递对象是[String]的?这是OOP,您为想要代表程序的实体创建类。另外,如您所见,类Music包含方法prepared,其中不包含Array类型。我想你将来会在Music课程中添加一些新的有用的方法。

不要犹豫提问。