【问题标题】:Swift Inheritance: Super's Super斯威夫特继承:超级的超级
【发布时间】:2016-03-08 15:01:16
【问题描述】:

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

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.super.foo().
  • 我试过super.super.foo(),但它没有编译
  • 是我尝试的第一件事,但没有成功!
  • 这是故意隐藏的。在任何健全的对象架构中,C 绝对不需要访问 A 的原始声明
  • 顺便说一句,在 C++ 中这可能是由于多重继承。 super 在 C++ 中是不够的,所以他们必须允许明确指定基类。使用已被超类覆盖的实现似乎是一个非常非常糟糕的主意。

标签: swift inheritance


【解决方案1】:

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

【讨论】:

  • 我已经考虑采用这种方式,但我可以解释为什么我不能显式调用 A::foo
  • @Velthune 阅读 this。如果您可以从NSObject 继承,您可以访问对象的superclass 并使用Objective-C 运行时为超类的超类创建COpaquePointer 并触发A 的foo 选择器。不支持多重继承。
  • 显着,非常显着!感谢您的链接和提示!
猜你喜欢
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 2021-01-29
  • 2017-07-22
  • 2017-03-24
  • 2018-02-20
  • 1970-01-01
  • 2017-05-02
相关资源
最近更新 更多