2017-08-01 1 views
0

私は、工場、デコレータ、責任の連鎖のようなミッシュマッシュで遊んでいます。基本的には、リクエストオブジェクトを受け取って解析し、より具体的な内部の工場にチェインを渡すファクトリを構築しています。私は下の構造に到着しましたが、それには問題があります。アップMoreSpecificThingFactorySpecificThingFactory内からnew'dを返すようにしようとしたときジェネリック、ファクトリ、そしてより多くの派生型を返す

public abstract class AbstractFactoryRequest { } 

public class SpecificFactoryRequest : AbstractFactoryRequest { } 

public class MoreSpecificFactoryRequest : SpecificFactoryRequest { } 

public interface IThing { } 

public interface IThingFactory<in T> where T : AbstractFactoryRequest 
{ 
    IThing GetThing(T request); 
} 

public abstract class AbstractThingFactory<T> : IThingFactory<T> where T : AbstractFactoryRequest 
{ 
    public IThing GetThing(T request) 
    { 
     var innerFactory = GetInnerFactory(request); 

     return innerFactory.GetThing(request); 
    } 

    protected abstract IThingFactory<T> GetInnerFactory(T request); 
} 

public class SpecificThingFactory : AbstractThingFactory<SpecificFactoryRequest> 
{ 
    protected override IThingFactory<SpecificFactoryRequest> GetInnerFactory(SpecificFactoryRequest request) 
    { 
     return (IThingFactory<SpecificFactoryRequest>)new MoreSpecificThingFactory(); 
    } 
} 

public class MoreSpecificThingFactory : AbstractThingFactory<MoreSpecificFactoryRequest> 
{ 
    protected override IThingFactory<MoreSpecificFactoryRequest> GetInnerFactory(MoreSpecificFactoryRequest request) 
    { 
     // return an even more specific factory... 
    } 
} 

問題が発生します。上記のようにキャストされると、ReSharperはこれを疑わしいキャストと呼びます。キャストなしでは、MoreSpecificThingFactoryとIThingFactoryの間に暗黙的な変換はないとコンパイラは言います。私はこれが継承されているのでおそらくこれがうまくいくと思っていました。これを修正する方法はありますか?

答えて

1

パラメータを反例として宣言しているため、このエラーが発生します。これは、メソッド引数の型としてのみ使用でき、戻り値の型として使用できないことを意味します。総称タイプの差異については、an articleです。

あなたは何をしようとしているのか考えてみましょう。それほど具体的でない型にキャストすると、より具体的なパラメータを受け入れるメソッドに対してより少ない特定のパラメータを渡すことができ、明らかにそれを行うことはできません。

次のようにMoreSpecificThingFactoryを定義する必要があり、この鋳造作業をするために:

public class MoreSpecificThingFactory : AbstractThingFactory<SpecificFactoryRequest> 
{ 
    protected override IThingFactory<SpecificFactoryRequest> GetInnerFactory(SpecificFactoryRequestrequest) 
    { 
     if (request is MoreSpecificFactoryRequest) 
     { 
      // return an even more specific factory... 
     } 
     // throw an exception or do something else 
    } 
} 

EDIT:

あなたがここにchain of responsibilityパターン

+0

ありがとうを適用する必要があると思われます。私はこれが私が探しているものだと思います。私は少し後にそれに取り組み、その時の答えを選択します。また、私は何らかの理由で「責任の連鎖」を考え、「命令の連鎖」をタイプしたと言いたいと思います。私はこれを解決します。 – bubbleking

関連する問題