覆盖 Swift 子类中的 属性

Override property in Swift subclass

任何人都可以解释子classing 属性时的行为吗?我相信对于为什么 'override' 实际上没有覆盖 属性.

有一个很好的解释

为什么 Swift 允许覆盖 surname 属性 但显然仍然使用超级 class 的 属性 和相关函数?它们不会被覆盖。

看来我必须定义一些在 didSet() 方法中调用的函数并覆盖它以确保 subclass 不会继承 super class' s 功能与 telephone 属性.

有什么方法可以覆盖 属性 的 didSet() 方法吗?创建一些被调用的函数似乎增加了不必要的额外复杂性?

实现此目标的正确方法是什么?

import Cocoa

class BaseClass {
    var _name: String?
    var name: String? {
        get {
            return _name
        }
        set {
            _name = newValue
            print("BaseClass \(name)")
        }
    }

    var surname: String? {
        didSet {
            print("BaseClass \(surname)")
        }
    }

    var telephone: String? {
        didSet {
            telephoneSet()
        }
    }

    func telephoneSet(){
        print("BaseClass \(telephone)")
    }
}

class SubClass: BaseClass {
    override var name: String? {
        get {
            return _name
        }
        set {
            _name = newValue
            print("SubClass \(name)")
        }
    }
    override var surname: String? {
        didSet {
            print("SubClass \(surname)")
        }
    }

    override func telephoneSet(){
        print("SubClass \(telephone)")
    }
}


let object = SubClass()

object.name = "Jenny"
object.surname = "Jones"
object.telephone = "10810"

生成以下输出:

SubClass Optional("Jenny")
BaseClass Optional("Jones")
SubClass Optional("Jones")
SubClass Optional("10810")

让我们简化例子:

class BaseClass {
    var surname: String? {
        didSet { print("BaseClass \(surname)") }
    }
}

class SubClass: BaseClass {
    override var surname: String? {
        didSet { print("SubClass \(surname)") }
    }
}

然后:

let object = SubClass()
object.surname = "Jones"

将产生:

BaseClass Optional("Jones")
SubClass Optional("Jones")

上面没有用另一个存储的 属性 覆盖存储的 属性、surname。只有基 class 的存储 属性 而子 class 只是将自己的观察者添加到此 属性。我推荐你参考 The Swift Programming Language: Inheritance: Overriding,它说:

Overriding Property Observers

You can use property overriding to add property observers to an inherited property. This enables you to be notified when the value of an inherited property changes, regardless of how that property was originally implemented.

在您的 name 示例中,您用子 class 自己计算的 属性 覆盖了计算的 属性。同样,在 telephoneSet 的示例中,您还使用 subclasses 自己的方法覆盖了该方法。但是对于 surname,您并没有覆盖基础 classes 的 属性,而只是让 subclass 添加一个观察者到基础 classes ' 存储 属性.