Interface (Generischer Typ Problem)
-
Hallo Gurus,
ich hab eine Interface IService und ein Interface IProvider:
Jede Klasse welche IService implementiert wird einer Klasse welche IProvider implementiert über generischen type zugeordnet. Jeder Service Bekommt eine Referenz des entsprechenden Providers. (Hintergrund: ich will services und zugehörige Provider über definierte Schnittstelle programmieren welche druch Typen gebunden sind.)
//Service Interface welceh einem best. Provider Typ zugeordnet ist interface IService<TProvider> { } //Provider welcher druch Klasse typsiert wird, beinhaltet services mit dem entsprechend Type interface IProvider<TType> where TType : IService<TType> { void Add(TType ser); } //ServiceA wird dem ProviderA zugeordnet class ServiceA : IService<ProviderA> { readonly IProvider<ProviderA> _pro = default(IProvider<ProviderA>); public ServiceA(IProvider<ProviderA> pro) { _pro = pro; } } //ProviderA wird definiert und beinhaltet nur Service A typen class ProviderA : IProvider<ServiceA> { List<ServiceA> list = new List<ServiceA>(); public void Add(ServiceA ser) { list.Add(ser); } } }
Nun kommen folgende Fehler, mit denen ich nix anfangen kann:(
Fehler 1 Der Typ "TagLib.ProviderA" kann nicht als Typparameter "TType" im generischen Typ oder in der generischen Methode "TagLib.IProvider<TType>" verwendet werden. Es ist keine implizite Verweiskonvertierung von "TagLib.ProviderA" in "TagLib.IService<TagLib.ProviderA>" vorhanden. C:\Documents and Settings\Operator\My Documents\Visual Studio 2008\Projects\TagLib\TagLib\test.cs 22 39 TagLib
Fehler 2 Der Typ "TagLib.ProviderA" kann nicht als Typparameter "TType" im generischen Typ oder in der generischen Methode "TagLib.IProvider<TType>" verwendet werden. Es ist keine implizite Verweiskonvertierung von "TagLib.ProviderA" in "TagLib.IService<TagLib.ProviderA>" vorhanden. C:\Documents and Settings\Operator\My Documents\Visual Studio 2008\Projects\TagLib\TagLib\test.cs 23 16 TagLib
Fehler 3 Der Typ "TProvider" kann nicht als Typparameter "TType" im generischen Typ oder in der generischen Methode "TagLib.IProvider<TType>" verwendet werden. Es ist keine Boxing-Konvertierung oder Typparameterkonvertierung von "TProvider" in "TagLib.IService<TProvider>" vorhanden. C:\Documents and Settings\Operator\My Documents\Visual Studio 2008\Projects\TagLib\TagLib\test.cs 30 30 TagLib
Fehler 4 Der Typ "TProvider" kann nicht als Typparameter "TType" im generischen Typ oder in der generischen Methode "TagLib.IProvider<TType>" verwendet werden. Es ist keine Boxing-Konvertierung oder Typparameterkonvertierung von "TProvider" in "TagLib.IService<TProvider>" vorhanden. C:\Documents and Settings\Operator\My Documents\Visual Studio 2008\Projects\TagLib\TagLib\test.cs 31 16 TagLib
-
So?
public interface IProvider<T, U> where T: IService<U> { } public class ProviderA : IProvider<ServiceA, ProviderA> { } public class ServiceA : IService<ProviderA> { }
-
Das ist schonmal eine gute idee... Nun möchte ich aber zwischen den Interface und den Konkreten Service klassen eine Abstracte Klasse zwischen schachteln.. hab sowas gemacht:
public interface IService<TProvider> { } public interface IProvider<T, U> where T : IService<U> { object ProviderInfo(); } public class ProviderA : IProvider<ServiceA, ProviderA> { public object ProviderInfo(){throw new NotImplementedException(); } } public class ProviderB : IProvider<ServiceB, ProviderB> { public object ProviderInfo() { throw new NotImplementedException(); } } public abstract class AbstractService<TProvider,TService> : IService<TProvider> { public readonly IProvider<TService, TProvider> /*HIER*/_pro = default(IProvider<TService, TProvider>); public /*HIER*/AbstractService(IProvider<TService, TProvider> pro) { _pro = pro; } } public class ServiceB : AbstractService<ProviderB,ServiceB> { public ServiceB(ProviderB Pro) : base(Pro) { } } public class ServiceA : AbstractService<ProviderA, ServiceA> { public ServiceA(ProviderA Pro) : base(Pro) { } }
Bei HIER Kommen 2 mal der gleiche Fehler welchen ich nich verstehe:
Fehler 2 Der Typ "TService" kann nicht als Typparameter "T" im generischen Typ oder in der generischen Methode "TagLib.IProvider<T,U>" verwendet werden. Es ist keine Boxing-Konvertierung oder Typparameterkonvertierung von "TService" in "TagLib.IService<TProvider>" vorhanden. C:\Documents and Settings\Operator\My Documents\Visual Studio 2008\Projects\TagLib\TagLib\test.cs 28 56 TagLib