Swift 如何重写子类中的静态变量?
我有一个超级班Swift 如何重写子类中的静态变量?,swift,Swift,我有一个超级班 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") } } 不能重写静态方法,因为它们的引
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")
}
}
不能重写静态方法,因为它们的引用方式与对象上的方法不同 请参阅stackoverflow上的现有帖子:您不能 正如其他人已经说过的,您不能重写静态方法或属性 改用
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")
}
}
即使忽略静态方法,它也能覆盖变量的值吗?我编辑了这个问题。当然,您可以按照您定义的变量来更改变量的值,但我不会称之为“覆盖”变量。如果您来自Java单词,可能您并不真正理解
static
的含义。这意味着该方法在编译期间是静态链接的,具体取决于变量的类型。如果变量实例
声明为asuper
,instance.printX()
将始终链接到asuper.printX()
。这就是static
的意思,这就是为什么重写没有意义。您需要一个虚拟方法,因为否则变量的运行时类型将不会更改行为。您需要一个类func
。关于变量x
,它实际上是一个属性。您可以覆盖它的setter和getter,并且可以在初始值设定项中设置默认值。在您的示例中,没有任何东西是静态的,我是否遗漏了什么?@erotsppa是的,正如我在回答中所解释的,在某些情况下,您可以使用类修饰符而不是静态的。