首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速继承:超级超级

快速继承:超级超级
EN

Stack Overflow用户
提问于 2016-03-08 15:01:16
回答 1查看 2.7K关注 0票数 7

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

代码语言:javascript
复制
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中实现呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-08 15:07:09

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

代码语言:javascript
复制
class C: B {
    override func foo() {
        super.foo()
        print("C")
    }
}

代码语言:javascript
复制
let c = C()
c.foo()

输出:

代码语言:javascript
复制
A
B
C

如果要有意地从AB公开foo(),则需要创建一个新的访问器:

代码语言:javascript
复制
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运行时的功能:

代码语言:javascript
复制
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
    }
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35870781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档