Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 快速继承:超级';太好了_Swift_Inheritance - Fatal编程技术网

Swift 快速继承:超级';太好了

Swift 快速继承:超级';太好了,swift,inheritance,Swift,Inheritance,假设这三个类具有简单的层次结构: 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类中,在重写的方

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

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++中,这可以用<代码> > > >:()(代码)>,但是如何在SWIFT中实现这一点?

<代码>超级。

输出:

A
B
C
如果您想故意从
B
公开
A
foo()
,则需要创建一个新的访问器:

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
    }
}

super.super.foo()
。我尝试了
super.super.foo()
,但它没有编译。这是我尝试的第一件事,肯定没有成功!这是故意隐藏的。完全没有必要使用<代码> C >代码>以任何方式访问任何SAN对象架构中的<代码> A<代码>的原始声明,在C++中这是可能的原因是多重继承。代码>超级在C++中是不够的,所以它们必须显式地指定基类。使用被超类覆盖的实现似乎是一个非常糟糕的主意。我已经考虑采用这种方式,但我可以解释为什么我不能调用::fooexplicitly@Velthune阅读如果可以从
NSObject
继承,则可以访问对象的
超类
,并使用Objective-C运行时创建一个到超类超类的
copaqueponinter
,并触发一个
foo
选择器。不支持多重继承。值得注意,非常值得注意!谢谢你的链接和提示!
class B: A {
    override func foo() {
        super.foo()
        print("B")
    }

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

class C: B {
    override func foo() {
        super.exposeFoo()
        print("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
    }
}