覆盖子类中的静态变量 swift 1.2

Posted

技术标签:

【中文标题】覆盖子类中的静态变量 swift 1.2【英文标题】:overriding static vars in subclasses swift 1.2 【发布时间】:2015-03-22 00:37:20 【问题描述】:

不像class var,它们可以在子类中被覆盖,我相信这同样适用于static,但不幸的是不是。这是一个例子

public class A 
    private static let NAME: String = "A"


public class B: A 
    private static let NAME: String = "B" //error

在我看来,静态意味着与该特定类的关联,因此在上面的示例中,B 应该有自己的空间来重新定义该变量,因为它仅与B 相关联,我将恢复为stored properties,除非有人有更好的解决方案。

【问题讨论】:

【参考方案1】:

您可以使用计算属性:

class A 
   class var Name: String 
       return "A"
   


class B: A 
   override class var Name: String 
       return "B"
   

用法:

print(A.Name) // "A"
print(B.Name) // "B"

【讨论】:

工作!。但是IDE没有帮助,用cmd +空格【参考方案2】:

documentation 说:

“ 静止的 ” 现在允许在类中使用方法和属性(作为“ 班级决赛 ”)。

所以它是final,这意味着你不能覆盖它。

【讨论】:

【参考方案3】:

按照建议,您不能覆盖静态变量,但可以使用类(静态)函数来覆盖。

class A 
   class func StaticValue() -> AnyObject 
      return "I am a String"
   


class B: A 
    override class func StaticValue() -> AnyObject 
        return 2
    

【讨论】:

【参考方案4】:

您可以拥有计算的类属性:

public class A 
   class var NAME: String 
       return "A"
   


public class B 
   class var NAME: String 
       return "B"
   

如果需要,您甚至可以“分支”到子类中的存储属性:

public class A 
       // Needs to be overriden in subclass
       class var NAME: String 
           return "A"
       
    

public class B 
   class var NAME: String 
       return B.storedName
   

   static var storedName: String = defineName()

   func defineName() -> String 
       // You could do something more complex here
       return "B"
   

【讨论】:

很好的提示。只是几句话-我相信您的意图是public class B: A 而不是public class B。您还必须添加override 关键字override class var name: String。不完全理解您对static var storedName: String = defineName() 的意图,因为您不能使用实例方法来初始化静态/类属性。

以上是关于覆盖子类中的静态变量 swift 1.2的主要内容,如果未能解决你的问题,请参考以下文章

Java中的覆盖和隐藏以及final关键字

java覆盖和隐藏

JAVA中方法和变量在继承中的覆盖和隐藏

有继承关系的对象执行顺序,包括静态变量,静态代码块,普通变量,普通代码块,继承方法.

子类能不能继承父类的成员变量

Java初始化顺序(静态变量静态初始化块实例变量实例初始化块构造方法)