您可以选择在 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")
    }
}

现在,您可以简单地创建带有和不带有 weaponclass 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
  • 的动态类型

如果你不想要这种继承行为,你最好考虑别的东西,比如协议,你只指定特定的行为而不指定内存布局。