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