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'
因此,要使其正常工作,我必须手动覆盖 A
和 B
中的每个函数,这并不是最糟糕的,因为我可以调用 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 - 在超类的覆盖函数中返回子类类型的主要内容,如果未能解决你的问题,请参考以下文章