gpt4 book ai didi

swift 继承 : Super's Super

转载 作者:搜寻专家 更新时间:2023-10-30 22:30:49 29 4
gpt4 key购买 nike

假设这三个类具有这个简单的层次结构:

class A {
func foo() {
print("A")
}
}

class B: A {
override func foo() {
super.foo()
print("B")
}
}

class C: B {
override func foo() {
// *******
print("C")
}
}

在 C 类中,在覆盖方法 foo 中我想调用一个方法 foo: 是否可能?

在 C++ 中,这可以通过 C->A::foo() 实现,但我如何在 Swift 中做到这一点?

最佳答案

super.foo() 应该足够了,因为 B 打印 "B" 并调用 super 打印 "A"

class C: B {
override func foo() {
super.foo()
print("C")
}
}

let c = C()
c.foo()

输出:

A
B
C

如果你想有意地从 B 中暴露出 Afoo(),你需要创建一个新的访问器:

class B: A {
override func foo() {
super.foo()
print("B")
}

func exposeFoo() {
super.foo()
}
}

class C: B {
override func foo() {
super.exposeFoo()
print("C")
}
}

或者,使用 NSObject 和 Objective-C 运行时的强大功能:

class A: NSObject { // make sure your base class inherits from NSObject
func foo() {
print("A")
}
}

// ...

class C: B {
override func foo() {

guard let superSuper = self.superclass?.superclass() else {
return; // no super super
}

let fooImp = class_getMethodImplementation(superSuper, "foo")

typealias MyCFunction = @convention(c) (AnyObject, Selector) -> Void
let curriedImplementation = unsafeBitCast(fooImp, MyCFunction.self)
curriedImplementation(self, selector) // prints A
}
}

关于 swift 继承 : Super's Super,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35870781/

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