ジェネリック型のデータでプラグインをサポートするアプリケーションを構築しています。問題は、通過する必要のあるすべてのものを許可する一般的な条件を指定できないようです。コードの詳細は次のとおりです。
abstract public class PluginObject<ManagedType>
abstract public class Plugin<EditedType> where EditedType : PluginObject<Object>
ここ<Object>
に問題があります。クラスとプラグインを作成するときに、プラグインのデータの側面を処理するモデルを作成します。この目的のために、私の最初のプラグインには管理するアイテムがたくさんあり、それらすべてのサブクラスを実際に作成することはできないため、IOrderObject
何も含まないインターフェイスを作成することになりました。
したがって、私は最終的に:
SynchronizableObject
TripRoute
TripRouteDirection
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>
このように、インターフェースまたはオブジェクトは、私がこの状態を本当に気にしないことによって提供される可能性があります。私が欲しいのは、私Plugin
のeditedtype
もの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'への暗黙の参照変換はありません
共分散を誤解しない限り(おそらくそうです)、私はあなたの例に明確に従っているようですが、それでも機能していません...