子类可以从其超类继承类型属性吗?如果是,如何覆盖它?

时间:2017-01-06 12:43:19

标签: ios inheritance properties swift3 override

code running in xcode

“对于类类型的计算类型属性,您可以使用class关键字来允许子类覆盖超类的实现。”

“您可以覆盖继承的实例或类型属性,以便为该属性提供自己的自定义getter和setter”                                                         ---- Apple Swift3

//override static
class A{
    var myValue = 0614
    static var storedTypeProperty = "Some value"
    class var overrideableComputedTypeProperty: Int {
        return 1
    }
}
class B: A {
    storedTypeProperty = "New String"
}

似乎B不会从A继承任何类型的属性。 那么如何在Swift3书中重写“继承的类型属性”。

1 个答案:

答案 0 :(得分:0)

您遇到的问题是因为您使用的是static变量。 static变量不能被覆盖,完全停止。没有必要在这里争论。

第一句话说,如果您有class(不是struct),例如class A {},则可以使用class关键字代替static }关键字,并覆盖类类型。这意味着,您可以将两个关键字用于相同目的,但主要区别在于static无法覆盖。

class A {
    // overridable computed property
    class var overridableClassPropery: String {
        return "This is class A's overwritten property" 
    }

    // Not overridable `static` computed property
    // Error will be shown if you try to override this property in class `B`
    static var notOverridableStaticPropery: String {
        return "Can not override this property in a subclass"
    }
}

第二个说,您可以覆盖超类类属性,并在子类中提供您自己的get实现,如下所示:

  class B: A {
    // Class type computed property can be overwritten
    override class var overridableClassPropery: String {
        return "This is class B's overwritten property"
    }
}

修改

notOverridableStaticPropery继承了class A的{​​p> class B,这意味着您可以通过class B访问/调用它。 但是您无法覆盖它,它将始终在class A中设置值。

print(A.notOverridableStaticPropery) // prints "This is class A's not overridable static property"
print(B.notOverridableStaticPropery) // prints "This is class A's not overridable static property"