您可以选择在 Swift 中的子 class 中继承什么吗?
Can you pick and choose what gets inherited in a sub-class in Swift?
我有一个基础 class(宇宙飞船),它有一些变量和一个初始值设定项。
我还有一个subclass(UFO)只需要superclass的一个变量。
当我尝试创建一个基本的 UFO 对象时,我得到:"missing argument for parameter 'weapon' in call var c = UFO()"
我意识到错误消息要求武器参数,但我如何(甚至可能吗?)创建一个不需要武器参数的基本 UFO 对象?
花了几个小时修改 "override"、"init" 和 "super" 命令。我在 SO 和其他网站上阅读了很多文章,但没有看到任何与我的情况类似的例子。同样,我假设我想做的事情是可能的。
class Spaceship {
var isUFO = false
var weapon:String
init(weapon:String) {
self.weapon = weapon
}
func printSomething() {
print("Test")
}
}
class UFO: Spaceship {
}
var a = Spaceship(weapon:"Laser")
a.printSomething() //OUTPUT: Test
var b = UFO(weapon:"")
//This runs, but I don't want to have to fill in parameters
b.printSomething() //OUTPUT: Test
var c = UFO() //Ultimately this is what I want to do
c.printSomething()
//OUTPUT: missing argument for parameter 'weapon' in call var c = UFO()
您可以将 weapon
标记为 optional String
。此外,在 init(weapon:)
中使用 weapon
的 默认值 作为 nil
,即
class Spaceship {
var isUFO = false
var weapon: String? //here...
init(weapon: String? = nil) { //here...
self.weapon = weapon
}
func printSomething() {
print("Test")
}
}
现在,您可以简单地创建带有和不带有 weapon
的 class UFO
对象,即
var a = Spaceship(weapon:"Laser")
var b = UFO(weapon:"Another Weapon")
var c = UFO()
首先,在使用继承时,您必须考虑 "is a" 关系:UFO 是 宇宙飞船。所以当每个飞船都有武器,UFO就是飞船,那么每个UFO也得有武器
你可以做的是让你的武器成为可选武器,但我认为这在某种程度上是mis-usage。另外,re-think 你的 isUFO
属性:
- 宇宙飞船不应该对特殊子类做出假设
- 您可以使用
is
运算符来检查 Spacehip
的动态类型
如果你不想要这种继承行为,你最好考虑别的东西,比如协议,你只指定特定的行为而不指定内存布局。
我有一个基础 class(宇宙飞船),它有一些变量和一个初始值设定项。 我还有一个subclass(UFO)只需要superclass的一个变量。 当我尝试创建一个基本的 UFO 对象时,我得到:"missing argument for parameter 'weapon' in call var c = UFO()" 我意识到错误消息要求武器参数,但我如何(甚至可能吗?)创建一个不需要武器参数的基本 UFO 对象?
花了几个小时修改 "override"、"init" 和 "super" 命令。我在 SO 和其他网站上阅读了很多文章,但没有看到任何与我的情况类似的例子。同样,我假设我想做的事情是可能的。
class Spaceship {
var isUFO = false
var weapon:String
init(weapon:String) {
self.weapon = weapon
}
func printSomething() {
print("Test")
}
}
class UFO: Spaceship {
}
var a = Spaceship(weapon:"Laser")
a.printSomething() //OUTPUT: Test
var b = UFO(weapon:"")
//This runs, but I don't want to have to fill in parameters
b.printSomething() //OUTPUT: Test
var c = UFO() //Ultimately this is what I want to do
c.printSomething()
//OUTPUT: missing argument for parameter 'weapon' in call var c = UFO()
您可以将 weapon
标记为 optional String
。此外,在 init(weapon:)
中使用 weapon
的 默认值 作为 nil
,即
class Spaceship {
var isUFO = false
var weapon: String? //here...
init(weapon: String? = nil) { //here...
self.weapon = weapon
}
func printSomething() {
print("Test")
}
}
现在,您可以简单地创建带有和不带有 weapon
的 class UFO
对象,即
var a = Spaceship(weapon:"Laser")
var b = UFO(weapon:"Another Weapon")
var c = UFO()
首先,在使用继承时,您必须考虑 "is a" 关系:UFO 是 宇宙飞船。所以当每个飞船都有武器,UFO就是飞船,那么每个UFO也得有武器
你可以做的是让你的武器成为可选武器,但我认为这在某种程度上是mis-usage。另外,re-think 你的 isUFO
属性:
- 宇宙飞船不应该对特殊子类做出假设
- 您可以使用
is
运算符来检查Spacehip
的动态类型
如果你不想要这种继承行为,你最好考虑别的东西,比如协议,你只指定特定的行为而不指定内存布局。