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

快速覆盖实例变量

胡彭亮
2023-03-14
问题内容

我知道这个答案已经以其他形式发布在这里,但是我想了解更多有关迅速覆盖实例变量的信息。

假设我有这段代码

class BaseView:UIView{
 let someVariable:Int = 1
 // do some work with someVariable
}

class ExtendedView:BaseView{
 let someVariable:Int = 2
}

好。从我读到的内容来看,常量需要覆盖前缀。其他答案说我应该声明setter和getter?为什么?我真的不在乎这两个。我只需要替换值即可。我真的不能使用init重写,因为我是从UIView继承的,这可能很危险(我认为)。

任何建议都欢迎。


问题答案:

如您所说,您不能简单地在子类中重新定义常量(毕竟,它是一个常量)。您收到的错误是“无法使用存储的属性覆盖”。它似乎是可以覆盖一个var,但是,当我改变了let someVariablevar someVariable我碰到一个“暧昧使用‘someVariable’的”当我访问它的子类(注意-
同样的事情发生了,我是否使用override与否)。

最简单的解决方案是使用吸气剂。这实际上是一个函数,因此您可以愉快地重写它,将为您管理后备变量,如果您不提供设置器,则该变量对于每个类都是恒定的:

class BaseView: UIView {
    var someVariable: Int { get { return 1 } }
    // do some work with someVariable
}

class ExtendedView: BaseView {
    override var someVariable: Int { get { return 2 } }
}

let a = BaseView()
a.someVariable // 1
let b = ExtendedView()
b.someVariable // 2

正如评论员@ user3633673指出的那样,如果 只有
一个getter(而不是setter),则可以删除get,但是为了清楚起见,我将其保留了下来。没有它就一样…

class BaseView: UIView {
    var someVariable: Int { return 1 }
    // do some work with someVariable
}

class ExtendedView: BaseView {
    override var someVariable: Int { return 2 }
}

let a = BaseView()
a.someVariable // 1
let b = ExtendedView()
b.someVariable // 2

…,当然,在Swift 5中,您可以删除return

class BaseView: UIView {
    var someVariable: Int { 1 }
}

class ExtendedView: BaseView {
    override var someVariable: Int { 2 }
}


 类似资料:
  • 问题内容: 我的二传手迅速遇到了一个奇怪的问题。我有带有代码的PlayingCard类: 我在另一个类中使用此init()方法,实现如下所示: 当代码看起来像上面的代码时,我在一行中遇到了一个错误: 但是,当我从 等级 和 西服 属性中删除setter和getter时,它工作正常,没有出现错误。 您能解释一下为什么出现此 EXC_BAD_ACCESS 错误吗? 谢谢您的帮助 问题答案: 通过写这个

  • 问题内容: 为什么我们不能覆盖子类中超类的实例变量? 问题答案: 因为如果您更改数据成员的实现,则很有可能会破坏超类(想象将超类的数据成员从float更改为String)。

  • 问题内容: 为什么超类的实例变量在继承中不被覆盖? 问题答案: 因为继承旨在修改行为。行为是通过方法公开的,这就是为什么可以覆盖它们的原因。 字段不是行为而是状态。您不需要修改它,也不需要修改超类使用的私有方法。它们旨在让超类完成其工作。

  • 问题内容: 如果我上课: 我最初以为我可以通过添加扩展名来覆盖子类而无需子类化: 该代码不会编译,但错误说明了该函数,这很有意义。 我的问题是: 是否仍要重写特定类的功能?换句话说,在某些情况下,例如上面的示例中,我可以替换功能吗?如果没有,是否有其他解决方法或方法来实现该行为(可能声明了另一个协议,idk) 现在,我考虑得更多了,我不得不说这是不可能的,因为是什么阻止某人重写任何标准库函数? 问

  • 问题内容: 我有一个Dockerfile,我想使用默认值来配置API。 来自socialengine / nginx-spa ENV API_URL本地主机:6007 因此,当我运行此映像时,我将能够使用以下内容覆盖localhost:6007: 码头工人运行-e API_URL = production.com:6007 ui 这是行不通的,我找不到如何执行此操作的清晰说明。 有什么建议吗? 问

  • 问题内容: 我得到输出b 3。为什么它没有给出b13作为输出。任何人都可以解释一下。 问题答案: 假设Foo类声明如下 变量没有覆盖的概念。他们只是被蒙面。 它正在打印3,因为当您使用超类引用访问变量时,它仅访问在超类中声明的变量。 请记住,超类对子类一无所知。