【问题标题】:How to override static variable in subclass?如何覆盖子类中的静态变量?
【发布时间】:2020-01-24 21:39:47
【问题描述】:

我有一个超类

class asuper{
 static var x = ""
 static func printX{
  print(x)
 }
}

但是我有一个子类想要更改值 x 我该怎么做?

class asubclass {
 static fucn newPrintX{
   //want to ensure X is changed before any static method uses x
   print(x + "sub")
 }
}

【问题讨论】:

  • 如果您来自 Java 一词,那么您可能并不真正理解 static 的含义。这意味着该方法在编译期间是静态链接的,具体取决于变量的类型。如果变量instance 声明为asuper,则instnace.printX() 将始终链接到asuper.printX()。这就是static 的意思,这就是为什么覆盖没有意义。您需要一个虚拟方法,否则变量的运行时类型不会改变行为。你需要一个class func
  • 关于变量x,其实是一个属性。您可以覆盖它的 setter 和 getter,并且可以在初始化程序中设置默认值。

标签: swift


【解决方案1】:

你不能

正如其他人已经说过的,您不能覆盖静态方法或属性。

改用class

因此,不能覆盖静态存储的属性。

但是静态计算属性和方法可以更新为类成员(而不是静态成员)。

它们仍然属于类型本身,您将能够在子类中被覆盖。

class Animal {

    class var typeName: String { "Animal" }

    class func saySomething() {
        print("I'm an Animal")
    }
}

class Dog: Animal {

    override class var typeName: String { "Dog" }

    override class func saySomething() {
        print("I'm a Dog")
    }
}

【讨论】:

  • 在你的例子中没有什么是静态的,我错过了什么吗?
  • @erotsppa 是的,正如我在回答中所解释的那样,在某些情况下,您可以使用 class 修饰符而不是 static
【解决方案2】:

您不能覆盖静态方法,因为它们的引用方式与对象上的方法不同。

在 stackoverflow 上查看此现有帖子:Swift override static method compile error

【讨论】:

  • 可以忽略静态方法,它可以覆盖变量的值吗?我编辑了问题
  • 当然,您可以更改定义变量的值,但我不会称其为“覆盖”它们。
猜你喜欢
  • 2016-03-03
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 2013-10-27
  • 2018-12-08
相关资源
最近更新 更多