【问题标题】:Swift - Return subclass type in overridden function of superclassSwift - 在超类的覆盖函数中返回子类类型
【发布时间】: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 但仍然浪费时间和重复代码。

【问题讨论】:

    标签: ios swift


    【解决方案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 的默认实现
    猜你喜欢
    • 2017-03-20
    • 2019-05-09
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2015-04-01
    • 2019-06-28
    相关资源
    最近更新 更多