gpt4 book ai didi

swift - 覆盖 Swift 子类中的属性

转载 作者:行者123 更新时间:2023-11-28 05:41:50 28 4
gpt4 key购买 nike

谁能解释子类化属性时的行为?我相信对于为什么“覆盖”实际上没有覆盖该属性有一个很好的解释。

为什么 Swift 允许覆盖 surname 属性,但显然仍然使用父类(super class)的属性和相关函数?它们不会被覆盖。

看来我必须定义一些在 didSet() 方法中调用的函数并覆盖它以确保子类不会像 那样继承父类的函数电话属性(property)。

有什么方法可以覆盖属性的 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。只有基类的存储属性,子类只是将自己的观察者添加到该属性。我推荐你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 示例中,您正在使用子类自己的计算属性覆盖计算属性。同样,在您的 telephoneSet 示例中,您还使用子类自己的方法覆盖了该方法。但是对于 surname,您并没有覆盖基类的属性,而只是让子类向基类的存储属性添加一个观察者。

关于swift - 覆盖 Swift 子类中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56411627/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com