2016-03-25 33 views
0

neden görünmüyor bu iş: Ben nesnenin kendisi için fabrika ekleyerek olası miras yapabilirsinizKalıtım sırasında Self protokolünde Self'e dönen Tür işlevleri için neden varsayılan uygulamaları sağlayamıyorum?

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

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

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

:

class Foo : Work { 
    required init() {} 

    static func make() -> Self { 
     return self.init() 
    } 
} 
Ben de olmayan bir sınıfını veya sınıf işaretlemek olabilir

final ama ben miras kullanmayı tercih ederim.

Bir protokole varsayılan fabrika uygulanabilmesi için, bir kalıtımsal türün tekrar uygulanmadan uyumlu hale gelmesi sağlanabilir.

+0

"İş" ne anlama geliyor ("çalışmıyor" veya "işe yarıyor" gibi)? – matt

+0

@matt sorusu açıklığa kavuştum, bunun için üzgünüm. Bu bağlamda "İş", bir sınıf nesnesini çoğaltmaksızın kalıtımsal bir nesnenin uyumlu olabilmesi anlamına gelir. – Logan

cevap

1

Bir protokole bağlı nesneleri başlatacak bir fabrika istiyorsanız, her zaman harika generics'u kullanmalısınız! E.g.

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

Cevabınız ne istediğimi tam olarak yapmadı, ancak bana birkaç küçük tweaks ile doğru çözümü getirdi! Cevabınızı düzenlemeler yaptım :) Tekrar teşekkürler! – Logan

+0

Bununla birlikte, bu nesnelerin kalıtım ağacının dışında nesneler oluşturması istenebilecek bazı başka karmaşıklıklar yaratır. Sanırım şu an elde edebildiğim en iyisi. – Logan

+0

Bu aslında sorunu çözmüyor çünkü ne yazık ki, uyumlu bir şekilde nasıl oluşturulduğunu tanımlayabilmelidir. Herhangi bir konformerin başka bir konformer yaratmasını istemek sorunludur. Hala ilginç bir yaklaşım için +1 :) – Logan