2016-04-11 7 views
-1

私は次のクラスがあります。キャストオブジェクト

class MyObject { } 
class MyObject2 { } 

interface Parent<T> 
{ 
    void DoSomething(T myObj); 
} 

class Child1 : Parent<MyObject1> 
{ 
    public void DoSomething(MyObject1 myObj) { } 
} 

class Child2 : Parent<MyObject2> 
{ 
    public void DoSomething(MyObject2 myObj) { } 
} 

を「私は親を返すファクトリメソッドを作成したいが、私は、次のキャストエラー

が暗黙的にタイプを変換できません取得Child1 'を' Parent 'に設定します。明示的な変換は、このための任意の回避策があります(あなたはキャストが欠けている?)

static Parent<object> Factory() 
    { 
     return new Child1(); 
    } 

存在しますか?

+0

'私はChild1からParentにキャストしようとするとキャストエラーが発生するので、何がエラーなのですか?返される関連するエラーを投稿していないかどうかはどうやって知っていますか? – MethodMan

+0

'親'!= '親'です。もしあなたが 'Parent 'を使いたいのであれば、あなたは[いくつかのインターフェースを作成する]必要があります(http://stackoverflow.com/questions/6623188/pattern-for-exposing-non-generic-version-of-generic-interface) 'を非汎用コンテキストで使用します。 (すなわち、 'List 'が非ジェネリック 'IList'をどのように実装しているかに似ています) –

+0

' T 'が何であるか分からない場合、クライアントは返されたオブジェクトをどのように使うべきですか? – Lee

答えて

5

あなたが求めていることはできません。 Parent<MyObject1>Parent<object>と呼ぶのは意味がありません。 stringがある場合は、署名がDoSomething(MyObject1)のメソッドに渡すことはできません。あなたがしようとしていることをやり遂げる別の方法を見つける必要があります。

public interface Parent 
{ 
    void DoSomething(object myObj); 
} 

と抽象クラスのような:そこにいくつかのミスかもしれないが、私の知る限りでは、あなたがこれを達成できるよう

0

私は少しずさんものの、のようなインターフェイスを作成し、完全にこれをテストしていません

public abstract class BaseParent<T> : Parent<T>, Parent 
{ 
    public abstract void DoSomething(T myObj); 

    public void DoSomething(object myObj) 
    { 
     T obj = myObj as T; 
     if (obj != null) 
     { 
      DoSomething(obj); 
      return; 
     } 

     // Do something to handle null values, unexpected values 
    } 
} 

抽象クラスを実装するようにChild1とChild2を変更します。すなわち、

class Child1 : BaseParent<MyObject1> 

「親」に子1または子2をキャストできます。

myObjがnullのT型の値であるため、null値を受け入れる必要がある場合は、もう少し処理する必要がある場合には対処しません。

は(正しいタイプではないオブジェクトを渡す場合そして、あなたは本当に最初の場所でこれを実行する必要がある場合、それは疑問だ、...何が起こることになっている?)

0

これは非常に興味深いです、ジェネリックとサブクラスの混合。しかし、私の見解では、2つの子クラスは必要ありません。なぜなら、それらは実際にはジェネリックパラメータだけが異なる同じクラスですからです。

あなたは

Public static Parent<MyObject1> Factory() 
{ 
    Return new Child1(); 
} 

を記述する場合、エラーが消えます。基本的にreturn型は、ファクトリメソッド自体が非ジェネリックなので、具体的な型でなければなりません。

だから、あなたがそうのように、一般的なようファクトリメソッドを作成する必要があります。

Public static Parent<T> Factory<T>() { return (Parent<T>)new Child1(); } 

あなたが実際に抽象工場を実装しようとしている、抽象工場はあなたのケースでは、オブジェクトの作成のための2つのパラメータを持っているものですもう1つは、ファクトリメソッドがオブジェクトを作成する際に使用するパラメータです。だから私は抽象的な工場のデザインパターンを見てみることをお勧めします