当前位置: 首页 > 面试题库 >

覆盖Swift中的存储属性

宇文育
2023-03-14
问题内容

我注意到编译器不会让我用另一个存储的值覆盖存储的属性(这似乎很奇怪):

class Jedi {
    var lightSaberColor = "Blue"
}


class Sith: Jedi {
    override var lightSaberColor = "Red" // Cannot override with a stored property lightSaberColor
}

但是,我可以使用计算属性来执行此操作:

class Jedi {
    let lightSaberColor = "Blue"
}


class Sith: Jedi {
    override var lightSaberColor : String{return "Red"}

}

为什么不允许我再给它一个值?

为什么用存储的属性覆盖是可憎的,而要使用计算的一个犹太洁食呢?他们在想什么呢?


问题答案:

为什么不允许我再给它另一个值?

绝对可以为继承的属性赋予不同的值。如果您在采用该初始值的构造函数中初始化属性,然后传递与派生类不同的值,则可以执行此操作:

class Jedi {
    // I made lightSaberColor read-only; you can make it writable if you prefer.
    let lightSaberColor : String
    init(_ lsc : String = "Blue") {
        lightSaberColor = lsc;
    }
}

class Sith : Jedi {
    init() {
        super.init("Red")
    }
}

let j1 = Jedi()
let j2 = Sith()

println(j1.lightSaberColor)
println(j2.lightSaberColor)

覆盖属性与为其赋予新值并不相同,它更像是为一个类赋予不同的属性。实际上,这就是在重写计算属性时发生的情况:在基类中计算该属性的代码
在派生类中计算该属性的重写的代码替换。

[是否]有可能覆盖实际的存储属性,即lightSaberColor具有其他行为?

除了观察者之外,存储的属性没有行为,因此实际上没有任何东西可以覆盖。通过上述机制可以为属性提供不同的值。这确实使用不同的语法来完成问题中的示例所要实现的目标。



 类似资料:
  • 问题内容: 我在Swift中制作了一个UIButton子类,以在选择时执行自定义绘图和动画 Swift 中的ObjC中的覆盖相当于什么? 我试过了 所以我可以实现一个观察者,但是我得到 问题答案: 像其他提到的一样,您可以使用它来检测更改。但是,在替代中,您不需要将值分配给super,而只是观察现有的更改。 您可以从以下游乐场观察到几件事: 覆盖的属性仍会为调用super 。您可以知道,因为状态从

  • 问题内容: 在Swift中,有人可以解释如何用原始属性的子类覆盖另一个超类的属性吗? 举一个简单的例子: 这给出了错误: 如果我将机箱设为“ var”,则会收到错误消息: 在指南中“覆盖属性”下唯一可以找到的内容表明,我们必须覆盖getter和setter,这可能会更改属性的值(如果它是’var’),但是如何更改属性类呢? ? 问题答案: Swift不允许您更改任何变量或属性的类类型。相反,您可以

  • 我有几个POJO,这将有一个货币数额。我的想法是创建一个通用对象(由货币和值组成),然后每当我想在我的POJOs中表示一个货币金额时,就会使用它: 由于将在多个POJO中使用,我无法用注释和属性,因为在所有情况下,列名并不总是相同的。有没有办法注释属性(如上例中的)以提供和属性的列名,以便jOOQ在映射/取消映射POJO时理解它们,类似于Hibernate解释请问?

  • 我想覆盖我在Quarkus应用程序的配置文件中配置的属性。 我怎样才能做到这一点?

  • 我正在使用Azure Blob存储来上传/下载文件。问题是,如果我上传到azure blob中的任何新文件与已经上传的文件同名,那么它会自动覆盖以前上传的文件的内容。 null 因此,如果我上传一个名为“file1.docx”的新文件,它们有不同的内容。那么blob存储将替换以前上传的file1.docx。所以在这种情况下,我丢失了以前上传的文件。 blob存储有什么方法可以自动检测到有重复,这样

  • 问题内容: 我正在使用Firebase和angular进行测验。在测验的最后,我想使用以下代码将新属性保存到users对象: 它可以工作,但也可以覆盖用户对象的所有属性。因此,该对象曾经像名称,用户名,电子邮件,密码等一样保存,但是当我按下topscore时,它成为该对象的唯一属性。为什么? 问题答案: 你为什么在这里使用?仅在将其三向绑定到Angular视图时才有用。如果您使用的是常规JavaS