2011-07-20 5 views
0

VB.NETでジェネリッククラスのファクトリを作成したいのですが、問題が発生しています。 (IPersistentObjectとしてT OF) IPersistentObjectとIPManagerBaseVB.NETのジェネリックのファクトリメソッド

ロジックはperistentオブジェクトの種類ごとに、私は、対応するマネージャクラスハンドリングクエリロジックを有することである:私は何

2つのインターフェイスです。

public class PManagerBase(Of T as IPersistentObject) Implements IPManagerBase(of T) 

だから、今、現実の世界で、私は永続的なタイプ「プエル」とそれに対応する管理者は、次のように宣言している:

は今、私はこのような基底クラスが持つ

public class PUserManager implements PManagerBase(Of PUser) 

私は約100の永続オブジェクトと対応するマネージャクラスを持っています。

は今、私はこのように呼び出します。工場、(詳細を削除)したい:私はこの

public class MyFactory 
    public shared function CreateManager(Of T as {PManagerBase(Of IPersistentObject), New}) as T 
     return new T() 
    end function 
end class 

ように私の工場を作成してい

MyFactory.CreateManager<PUserManager>() 

を偉大なルックス。

今、私はそれを呼び出すようにしたい:

Dim myManager = MyFactory.CreateManager<PUserManager>() 

どうなりますか? "PUserManagerはPManagerBase(Of IPersistentObject)を実装または継承しません"というコンパイルエラーが発生します。私はドイツ語でメッセージを受け取るので、これは無料の翻訳です。

これを実行するには何を変更する必要がありますか?

public class MyFactory 
    public shared function CreateManager(Of T as {PManagerBase(Of PUser), New}) as T 
     return new T() 
    end function 
end class 

しかし、それはプエルオブジェクトの管理者に対してのみ機能するので、その後の利益が、なくなっている:私はこのような私の工場を宣言した場合 それは動作します。

より良い解決策は、この作品

public class MyFactory 
    public shared function CreateManager(Of T as {PManagerBase(Of U), New}, U as IPersistentObject) as T 
     return new T() 
    end function 
end class 

ですが、私は今、このように私のファクトリメソッドを呼び出す必要があります:これは冗長であり、Iドン以来

Dim myManager = MyFactory.CreateManager<PUserManager, PUser>() 

私はこれが好きではありません関数内にUが全く必要ありません。その宣言では、PUserManagerはPUserに結びついています。

良い方法がありますか? PUserManagerがPManagerBase(Of IPersistentObject)から継承しないのはなぜですか?

答えて

0

これはジェネリックスの問題です。VS 2010を使用している場合は、共分散と反差異を見て、それに従ってIPManagerBaseの定義を変更することができます。