首先,我想提一下,我是一个快速的初学者,这是我有史以来的第一次编程体验。因此,对于你们中的一些人来说,这些问题听起来非常明显......感谢您的理解:)
在使用同名的子类重写函数访问超类函数时,我有些不明白的地方。
这涉及我正在关注的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)"
}
}
我的理解是:
class Music
允许我创建一个音符串。 func play(_ music: Music)
接受音乐类作为输入。参数名称为music:class Piano: Instrument
有一个override func play(_ music: Music)
let preparedNotes = super.play(music)
,我们正在访问父类func play(_ music: Music)
(只是为了它的乐趣,因为在我看来,我们不会添加任何更改吗?)- 第一个问题:因为似乎可以使用类作为函数的参数,任何人都可以向我展示与此主题相关的任何文档吗?我已经搜索过Apple文档但却找不到任何相关信息......这真让我感到困惑。
- 第二个问题:有人可以向我解释,为什么我们在super.play之后使用(音乐)?当我使用自动完成时,命题是super.play(music: Music)
,这是非常令人困惑的。这就像我们在这里使用参数名称作为valide参数。这是因为,我们打算首先通过创建音乐实例来设置音乐参数吗? -
- 第三个问题:为什么我们在报价中谈论“特殊类型”?什么是特殊类型?
非常感谢您阅读所有这些内容!
答案 0 :(得分:0)
秒:您将调用musi
c的对象传递给超类的play
方法。即使您在继承类中override
方法M
,也可以在超类中访问方法M
的原始实现。
第三个问题:为什么类型Music
的传递对象是[String]
的?这是OOP,您为想要代表程序的实体创建类。另外,如您所见,类Music
包含方法prepared
,其中不包含Array
类型。我想你将来会在Music
课程中添加一些新的有用的方法。
不要犹豫提问。