0

ジェネリック型のデータでプラグインをサポートするアプリケーションを構築しています。問題は、通過する必要のあるすべてのものを許可する一般的な条件を指定できないようです。コードの詳細は次のとおりです。

abstract public class PluginObject<ManagedType>
abstract public class Plugin<EditedType> where EditedType : PluginObject<Object>

ここ<Object>に問題があります。クラスとプラグインを作成するときに、プラグインのデータの側面を処理するモデルを作成します。この目的のために、私の最初のプラグインには管理するアイテムがたくさんあり、それらすべてのサブクラスを実際に作成することはできないため、IOrderObject何も含まないインターフェイスを作成することになりました。

したがって、私は最終的に:

  1. SynchronizableObject
  2. TripRoute
  3. TripRouteDirection
  4. ITripObject(#2と#3に実装されたインターフェース)

このように私はすることができます:

public class RoutePluginObject<ManagedType> : Activis.Framework.Admin.PluginObject<ManagedType>
public class RouteManagementPlugin : Activis.Framework.Admin.Plugin<RoutePluginObject<Transdev.Limocar.iTripObject>>

そしてそれは受け入れられますが、問題はITripObjectオブジェクトではなくインターフェースであるため、に変換できることPluginObject<Object>です。

だから私の質問は、これに似たものを許可する条件を指定する方法はありますか?

abstract public class Plugin<EditedType> where EditedType : PluginObject<Any>

このように、インターフェースまたはオブジェクトは、私がこの状態を本当に気にしないことによって提供される可能性があります。私が欲しいのは、私PlugineditedtypeものPluginObjectが可能な限りのものであることです。


編集

共分散でより良い結果が得られましたが、それでもエラーが発生しました。例(Matias)でPluginObjectの継承については何も見ていません。これが、私が行ったことです。

public interface IPluginObject<out ManagedType>
abstract public class Plugin<EditedType> where EditedType : IPluginObject<EditedType>
public class RoutePluginObject : Activis.Framework.Admin.IPluginObject<TripRoute>
public class RouteManagementPlugin : Activis.Framework.Admin.Plugin<RoutePluginObject>

しかし、RouteManagementPluginで次のエラーが発生します。

タイプ「Transdev.Limocar.Admin.RoutePluginObject」は、ジェネリック型またはメソッド「Activis.Framework.Admin.Plugin」のタイプパラメータ「EditedType」として使用できません。'Transdev.Limocar.Admin.RoutePluginObject'から'Activis.Framework.Admin.IPluginObject'への暗黙の参照変換はありません

共分散を誤解しない限り(おそらくそうです)、私はあなたの例に明確に従っているようですが、それでも機能していません...

4

2 に答える 2

3

2番目のジェネリックパラメーターが必要です。

abstract public class PluginObject<ManagedType> {}
abstract public class Plugin<EditedType, OtherType> where EditedType : PluginObject<OtherType>
于 2012-11-01T19:52:49.863 に答える
1

共分散が必要です。

つまり、ジェネリックパラメータをダウンキャストできます。

共変性と反変性は、インターフェースでのみ使用でき、ジェネリックパラメーターをデリゲートします。

あなたの場合、PluginObjectインターフェースとして実装する必要があります。

public interface IPluginObject<out T>

これにより、コードで次のことが可能になります。

public abstract class Plugin<TEdited> where TEdited : IPluginObject<TEdited>

一日の終わりに、あなたが型Personと派生型を持っているとしましょうEmployeePersonを実装しIPluginObject<out T>ます。次に、共分散のおかげで、次のコードが有効になります。

IPluginObject<object> myPluginObject = new Employee();

最後に、もちろん、これを行うことができます:

public class MyPlugin : Plugin<Employee>
{
}

これはあなたが探しているものですか?

このトピックの詳細については、MSDNの記事を確認してください:http://msdn.microsoft.com/en-us/library/dd799517.aspx

于 2012-11-01T20:20:40.120 に答える