我有一个Swift协议,定义了如下方法:
protocol MyProtocol {
class func retrieve(id:String) -> Self?
}
我有几个不同的类将符合此协议:
class MyClass1 : MyProtocol { ... }
class MyClass2 : MyProtocol { ... }
class MyClass3 : MyProtocol { ... }
在每个子类中,“retrieve”方法的实现几乎是相同的。我希望将这些函数的通用实现提取到符合协议的共享超类中:
class MyBaseClass : MyProtocol
{
class func retrieve(id:String) -> MyBaseClass?
}
class MyClass1 : MyBaseClass { ... }
class MyClass2 : MyBaseClass { ... }
class MyClass3 : MyBaseClass { ... }
这种方法的问题在于,我的协议将
retrieve
方法的返回类型定义为Self
类型,这正是我最终想要的。然而,结果是我不能以这种方式在基类中实现retrieve
,因为它会导致MyClass1
、MyClass2
和MyClass3
的编译错误。每个类都必须符合从MyBaseClass
继承的协议。但是因为该方法的返回类型是MyBaseClass
,而协议要求它是MyClass1
,所以它说我的类不符合协议。我想知道是否有一种干净的方法,在基类中实现一个引用一个或多个方法的
Self
类型的协议方法。当然,我可以在基类中实现一个不同命名的方法,然后让每个子类通过调用其超类的方法来实现协议来完成工作,但是这对我来说似乎不太优雅。是否有更直接的方法我错过了什么?