我正在尝试允许超类中的方法返回子类的实例,以便我可以在父级和子级上使用方法链接。
然而,我收到错误" BaseClass没有名为someOtherChainableMethod"当我尝试链接方法时。这是我的代码:
class BaseClass {
func someChainableMethod() -> BaseClass {
return self
}
}
class ChildClass: BaseClass {
func someOtherChainableMethod() -> ChildClass {
return self
}
}
let childClass = ChildClass
childClass.someChainableMethod().someOtherChainableMethoid()
问题似乎是“回归自我”。在父链中,能够返回类型为BaseClass
而不是ChildClass
的实例。
我也用泛型尝试了这个并且失败了,这就是我试过的:
class BaseClass<T> {
func someChainableMethod() -> T {
return self
}
}
class ChildClass: BaseClass<ChildClass> {
func someOtherChainableMethod() -> ChildClass {
return self
}
}
let childClass = ChildClass
childClass.someChainableMethod().someOtherChainableMethoid()
在这种情况下,BaseClass
someChainableMethod
方法的错误是&#34; BaseClass无法转换为T&#34;。
答案 0 :(得分:10)
如果将方法的返回类型更改为Self
:
class BaseClass {
func someChainableMethod() -> Self {
return self
}
}
class ChildClass: BaseClass {
func someOtherChainableMethod() -> Self {
return self
}
}
let childClass = ChildClass()
let foo = childClass.someChainableMethod().someOtherChainableMethod()
答案 1 :(得分:0)
在基类中添加someOtherChaingableMethod
并留下一个空实现。
答案 2 :(得分:0)
由于您已经知道childClass是ChildClass的一个实例,您可以
(childClass.someChainableMethod() as ChildClass).someOtherChainableMethoid()
答案 3 :(得分:0)
简单地覆盖基类someChainableMethod
class BaseClass {
func someChainableMethod() -> Self{
return self
}
}
class ChildClass: BaseClass {
override func someChainableMethod() -> Self {
return self
}
func A(){
}
}
var objChild = ChildClass()
objChild.someChainableMethod()