从swift中的基类返回子类

时间:2014-10-10 10:08:31

标签: inheritance swift

我正在尝试允许超类中的方法返回子类的实例,以便我可以在父级和子级上使用方法链接。

然而,我收到错误" 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;。

4 个答案:

答案 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()