【问题标题】:Access properties in parent class initializer that are changed by child class访问由子类更改的父类初始化程序中的属性
【发布时间】:2021-06-02 23:07:19
【问题描述】:

在父类初始化器中,我想使用已被子类覆盖的属性。

看这个例子:

import Foundation

class Parent
{
    var string = "Parent"
    init()
    {
        print(string) // prints "Parent", would like it to print "Child"
    }
}

class Child: Parent
{
    override init()
    {
        super.init()
        string = "Child"
    }
}

let child = Child()

defer { print(string) } 无济于事,因为它只是在子类发生任何更改之前将打印移动到父类初始化器之后。

Swift 为这个案例提供了哪些可能性?

【问题讨论】:

  • 你修改string 之后调用super.init(),你期待什么? print(child.string) 确实打印了正确的值。
  • 不会的。在运行时,它将打印初始化值 - 父级。这不是初始化程序的目的。您能否在问题中添加您想要实现的目标?
  • @vadian 这正是问题所在。我想知道是否有一种语言功能允许我在所有子初始化完成后推迟一个要调用的语句。在我的示例中,它是在子初始化完成之前完成的。
  • @flanker 让我想想

标签: swift inheritance init deferred initializer


【解决方案1】:

一种可能的方法是使用默认值实现init(string

class Parent
{
    var string : String
    
    init(string : String = "Parent")
    {
        self.string = string
        print(string)
    }
}

class Child: Parent
{
    init()
    {
        super.init(string: "Child")
    }
}

let parent = Parent() // prints "Parent"
let child = Child() // prints "Child"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多