11 Stimmen

Die Rückgabe einer Unterklasse von ihrer Basisklasse in Swift

Ich versuche, einer Methode in einer Superklasse zu erlauben, eine Instanz der Unterklasse zurückzugeben, damit ich Methodenverkettung mit Methoden sowohl in der Elternklasse als auch in der Kindklasse verwenden kann.

Ich bekomme jedoch den Fehler "BaseClass hat kein Element mit dem Namen someOtherChainableMethod", wenn ich versuche, die Methoden zu verketteln. Hier ist mein Code:

class BaseClass {
    func someChainableMethod() -> BaseClass {
        return self
    }
}

class ChildClass: BaseClass {
    func someOtherChainableMethod() -> ChildClass {
        return self
    }
}

let childClass = ChildClass

childClass.someChainableMethod().someOtherChainableMethoid()

Das Problem scheint zu sein, dass das 'return self' in der übergeordneten verkettbaren Methode eine Instanz mit dem Typ BaseClass zurückgibt, anstatt ChildClass.

Ich habe es auch mit Generics versucht und bin gescheitert, das ist was ich versucht habe:

class BaseClass {
    func someChainableMethod() -> T {
        return self
    }
}

class ChildClass: BaseClass {
    func someOtherChainableMethod() -> ChildClass {
        return self
    }
}

let childClass = ChildClass

childClass.someChainableMethod().someOtherChainableMethoid()

In diesem Fall ist der Fehler von der BaseClass someChainableMethod Methode "BaseClass ist nicht in T konvertierbar".

14voto

Martin R Punkte 510450

Ihr Code funktioniert, wenn Sie den Rückgabetyp der Methoden auf Self ändern:

class BaseClass {
    func someChainableMethod() -> Self {
        return self
    }
}

class ChildClass: BaseClass {
    func someOtherChainableMethod() -> Self {
        return self
    }
}

let childClass = ChildClass()
let foo = childClass.someChainableMethod().someOtherChainableMethod()

0voto

Ken Kuan Punkte 809

Fügen Sie someOtherChaingableMethod in Ihre Basisklasse ein und lassen Sie eine leere Implementierung zurück.

0voto

Da du bereits weißt, dass childClass eine Instanz von ChildClass ist, kannst du dies tun

(childClass.someChainableMethod() as ChildClass).someOtherChainableMethoid()

0voto

Rein rPavi Punkte 3312

Einfach die Basisklasse someChainableMethod überschreiben

class BaseClass {
    func someChainableMethod() -> Self{
        return self
    }
}

class ChildClass: BaseClass {
    override func someChainableMethod() -> Self {
        return self
    }
    func A(){

    }
}

var objChild = ChildClass()
objChild.someChainableMethod()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X