2016-03-25 1 views
0

しないのはなぜこの作品:私はオブジェクト自体に工場を追加することで可能に継承を行うことができます継承を使用しているときに、自己でプロトコルを返すタイプ関数のデフォルトの実装を提供できないのはなぜですか?

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() 
    } 
} 
私はまた、非クラスを使用するか、クラスをマークすることができ

finalしかし、私は、継承を使用することを好む/必要とします。

プロトコルにデフォルトのファクトリを実装して、継承可能な型を再実装せずに準拠させることは可能ですか?

+0

「動作しない」または「動作させる」とはどういう意味ですか? – matt

+0

私は@mattの質問で明らかにしました、ごめんなさい。この文脈での "仕事"は、継承可能なオブジェクトがクラスレベルのコンストラクタを複製せずに適合できることを意味します。 – Logan

答えて

1

プロトコルに準拠したオブジェクトを初期化するファクトリを使用する場合は、常に最高のgenerics!を使用する必要があります。 など。

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

あなたの答えは私が望んでいたものではありませんでしたが、それは正しいソリューションに導かれました。あなたの答えを編集しました:)もう一度おねがいします! – Logan

+0

これは、オブジェクトが継承ツリーの外にオブジェクトを作成するように要求されることがある他の複雑な問題を作り出します。私はそれがまだ私が今達成できる最高だと思う。 – Logan

+0

残念なことに、コンフォーマーは、コンフォーマーがその作成方法を定義できる必要があるため、実際には問題を解決しません。他の配座異性体を生成するために異性体を求めることができることは問題である。興味深いアプローチのために+1が残っています:) – Logan

関連する問題