Swift - 在超类的覆盖函数中返回子类类型

Posted

技术标签:

【中文标题】Swift - 在超类的覆盖函数中返回子类类型【英文标题】:Swift - Return subclass type in overridden function of superclass 【发布时间】:2020-05-05 20:08:41 【问题描述】:

我正在尝试快速实现可链接的对象设计。这是我的结构:

class A
    func get() -> some A
        return self
    


class B:A
    func set()

    

我可以创建一个即使我创建原始类的子类也能工作的方法吗?在我的示例中,如果我在 B 上调用 get,我将得到一个类型为 A 的对象,它没有名为 set 的方法。

let b = B()
b.get().set() // A has no member 'set'

因此,要使其正常工作,我必须手动覆盖 AB 中的每个函数,这并不是最糟糕的,因为我可以调用 super 但仍然浪费时间和重复代码。

【问题讨论】:

【参考方案1】:

如果你真的不需要使用带有some 关键字的不透明类型,你可以使用协议和扩展来获得你想要的:

protocol Chainable  
    func get() -> Self 
 
extension Chainable  
    func get() -> Self  
        return self 
     
 
class A: Chainable 
class B: A  
    func set()  
        print("ok") 
     
 

现在您获得了 get 函数所需的返回类型:

let a = A()
a.get() // Type = A
let b = B()
b.get() // Type = B
b.get().set() // Prints 'ok'

如果您不需要跨多个类层次结构重用它,则解决方案可以更简单(感谢@Joakim Danielson 指出这一点):

class A 
    func get() -> Self  
        return self 
    

class B: A   
    func set()   
        print("ok")  
      
 

【讨论】:

您也可以不使用该协议,并在A 中使用get 的默认实现

以上是关于Swift - 在超类的覆盖函数中返回子类类型的主要内容,如果未能解决你的问题,请参考以下文章

在超类中定义泛型类型,它指的是它所在的子类的类型

Java:在超类方法签名中返回子类

Java继承

父类中的方法被覆盖以及子类调用父类覆盖的方法

在超类中使用描述符以避免子类中的代码重复

swift 学习- 14 -- 继承