为什么我不能为使用继承时在协议中返回Self的Type函数提供默认实现?

时间:2016-03-25 01:04:58

标签: swift inheritance protocols swift-protocols

为什么这不起作用:

protocol Work {
    init()
    static func make() -> Self
}

extension Work {
    static func make() -> Self {
        return self.init()
    }
}

class Foo : Work {
    required init() {}
}

我可以通过将工厂添加到对象本身来实现继承:

class Foo : Work {
    required init() {}

    static func make() -> Self {
        return self.init()
    }
}

我也可以使用非类或标记类final,但我更喜欢/我需要使用继承。

是否可以在协议上实现默认工厂,以便可继承类型可以符合而无需再次实现。

1 个答案:

答案 0 :(得分:1)

如果你想要一个初始化符合协议的对象的工厂,你应该使用总是很棒的generics! E.g。

protocol Work {
    init()
    static func make<T: Work>(type: T.Type) -> T
}

extension Work {
    static func make<T: Work>(type: T.Type) -> T {
        return T.init()
    }
    static func make() -> Self {
        return make(Self)
    }
}

class Foo : Work {
    required init() {}
}