2016-03-25 3 views
0

Warum funktioniert diese Arbeit:Warum kann ich keine Standardimplementierungen für Type-Funktionen bereitstellen, die Self im Protokoll zurückgeben, wenn Vererbung verwendet wird?

class Foo : Work { 
    required init() {} 

    static func make() -> Self { 
     return self.init() 
    } 
} 

Ich könnte auch eine nicht-Klasse verwenden, oder die Klasse markieren final:

protocol Work { 
    init() 
    static func make() -> Self 
} 

extension Work { 
    static func make() -> Self { 
     return self.init() 
    } 
} 

class Foo : Work { 
    required init() {} 
} 

I Vererbung möglich, indem die Fabrik auf das Objekt selbst machen kann , aber ich möchte/muss Vererbung verwenden.

Ist es möglich, eine Standardfactory für ein Protokoll zu implementieren, sodass ein vererbbarer Typ ohne erneute Implementierung übereinstimmen kann?

+0

Was bedeutet "arbeiten" (wie in "funktioniert nicht" oder "es funktioniert")? – matt

+0

Ich klärte in der Frage @matt, sorry darüber. "Arbeit" bedeutet in diesem Zusammenhang, dass ein vererbbares Objekt konform sein kann, ohne den Konstruktor auf Klassenebene zu duplizieren. – Logan

Antwort

1

Wenn Sie eine Fabrik, die Objekte nach einem Protokoll initialisieren wollen, sollten Sie die immer super generics verwenden! Zum Beispiel

protocol Work { 
    init() 
    static func make<T: Work>(type: T.Type) -> T 
} 

extension Work { 
    static func make<T: Work>(type: T.Type) -> T { 
     return T.init() 
    } 
    static func make() -> Self { 
     return make(Self) 
    } 
} 

class Foo : Work { 
    required init() {} 
} 
+0

Deine Antwort hat nicht ganz das gemacht, was ich wollte, aber es hat mich mit ein paar kleinen Verbesserungen zur richtigen Lösung geführt! Ich habe Änderungen an Ihrer Antwort vorgenommen :) Danke nochmal! – Logan

+0

Dies führt jedoch zu einigen anderen Komplikationen, bei denen Objekte aufgefordert werden, Objekte außerhalb ihres Vererbungsbaums zu erstellen. Ich denke, es ist immer noch das Beste, was ich im Moment erreichen kann. – Logan

+0

Dies löst das Problem nicht wirklich, da der Konformer leider definieren kann, wie er erstellt wird. Es ist problematisch, dass jeder Konformer irgendein anderes Konformer erstellen kann. Immer noch +1 für eine interessante Herangehensweise :) – Logan

Verwandte Themen