【发布时间】:2014-11-19 04:25:51
【问题描述】:
我有一个定义如下方法的 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 类型。我当然可以在基类中实现一个不同名称的方法,然后让每个子类通过调用其超类的方法来实现协议来完成这项工作,但这对我来说似乎不是特别优雅。
我在这里缺少更直接的方法吗?
【问题讨论】:
标签: swift